您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> 处女贴:linux下通过JNI用C/C++中调用JAVA类,java类添加依赖包后,c++无法调用,无法找到class

处女贴:linux下通过JNI用C/C++中调用JAVA类,java类添加依赖包后,c++无法调用,无法找到class

来源:网络整理     时间:2016/8/27 11:55:53     关键词:

关于网友提出的“ 处女贴:linux下通过JNI用C/C++中调用JAVA类,java类添加依赖包后,c++无法调用,无法找到class”问题疑问,本网通过在网上对“ 处女贴:linux下通过JNI用C/C++中调用JAVA类,java类添加依赖包后,c++无法调用,无法找到class”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 处女贴:linux下通过JNI用C/C++中调用JAVA类,java类添加依赖包后,c++无法调用,无法找到class
描述:

c++java

案例原帖 http://blog.sina.com.cn/s/blog_48eef8410100fjxr.html
照着这样的例子下来是可以调用的,但import一个简单依赖包后就无法调用了,cpp代码如下
#include 
#include 
#include 
#include 
#include 
#include 
 
jstring stoJstring(JNIEnv* env, const char* pat)
{
  jclass strClass = env->FindClass("java/lang/String");
  jmethodID ctorID = env->GetMethodID(strClass, "", "([BLjava/lang/String;)V");
  jbyteArray bytes = env->NewByteArray(strlen(pat));
  env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
  jstring encoding = env->NewStringUTF("utf-8");
  return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}
 
char* jstringTostring(JNIEnv* env, jstring jstr)
{
 char* rtn = NULL;
 jclass clsstring = env->FindClass("java/lang/String");
 jstring strencode = env->NewStringUTF("utf-8");
 jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
 jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
 jsize alen = env->GetArrayLength(barr);
 jbyte* ba = env->GetByteArrayElements(barr,JNI_FALSE);
 if(alen > 0){
  rtn = (char*)malloc(alen + 1);
  memcpy(rtn, ba, alen);
  rtn[alen] = 0;
 }
 env->ReleaseByteArrayElements(barr, ba, 0);
 return rtn;
}
 
using namespace std;
 
int main()
{
 JavaVMOption options[2];
 JNIEnv *env;
 JavaVM *jvm;
 JavaVMInitArgs vm_args;
 long status;
 jclass cls;
 jmethodID mid;
 jint square;
 jboolean jnot;
 jobject jobj;
 options[0].optionString = "-Djava.compiler=NONE";
 options[1].optionString = "-Djava.class.path=./;/home/grid/app/Test/lib/test.jar";
 cout<<><>
 //options[2].optionString = "-verbose:jni"; 用于跟踪运行时的信息
 vm_args.version = JNI_VERSION_1_4; // JDK版本号
 vm_args.nOptions = 2;
 vm_args.options = options;
 vm_args.ignoreUnrecognized = JNI_TRUE;
 status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
 if(status != JNI_ERR){
  printf("create java jvm success\n");
  cls = env->FindClass("com/test/MyTest");  // 在这里查找ava类
  if(cls !=0){
   printf("find java class success\n");
   // 构造函数
   mid = env->GetMethodID(cls,"","(II)I");
   if(mid !=0){
    jobj=env->NewObject(cls,mid);
    std::cout << "init ok" << std::endl;
   }
       
   // 调用add函数
   mid = env->GetStaticMethodID( cls, "add", "(II)I");
   if(mid !=0){
    square = env->CallStaticIntMethod( cls, mid, 5,5);
    std::cout << square << std::endl;
   }
   
   // 调用judge函数
  }
  else{
   fprintf(stderr, "FindClass failed\n");
  }
 
  jvm->DestroyJavaVM();
  fprintf(stdout, "Java VM destory.\n");
  return 0;
 }
 else{
  printf("create java jvm fail\n");
  return -1;
 }
}

Mytest.java
package com.test;
import rtest.Test;
public class Mytest {
static Test sb = new Test();
public static int add(int a, int b) {
return sb.ad(a, b) + a + b;
}
public boolean judge(boolean bool) {
return !bool;
}
public static void main(String[] args) {
System.out.println(add(5, 5));
}
}

Test.java
package rtest;
public class Test {
public int ad(int a, int b) {
return a + b;
}
}

java独立运行是成功的
c++调用就提示FindClass failed
在网上找了好多答案都是说启动参数要加上依赖包路径,可我加了还是一样
 options[1].optionString = "-Djava.class.path=./;/home/grid/app/Test/lib/test.jar";
跪求大侠解答,在线等
解决方案1:

 options[1].optionString = "-Djava.class.path=./;/home/grid/app/Test/lib/test.jar";
他妈的这里是用冒号分隔的你用分号???


以上介绍了“ 处女贴:linux下通过JNI用C/C++中调用JAVA类,java类添加依赖包后,c++无法调用,无法找到class”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3633033.html

相关图片

相关文章