当前位置: 代码迷 >> Java Web开发 >> Jni
  详细解决方案

Jni

热度:516   发布时间:2016-04-16 22:18:56.0
Jni求助
本帖最后由 doudoushen 于 2014-05-21 17:26:42 编辑
我用的是java(非安卓),需要实现的是一个C++ JAVA相互调用的功能即: java<--> so <-->c++。另外不存在多线程(c++ so java中都是单线程)
现在遇到如下问题FindClass 返回为空

java的class文件按照包结构已经放在 /mnt/hgfs/debug/linux/webtest/目录下了 

jdk版本1.7.0_55

创建JVM

JavaVMOption options[3];
JavaVMInitArgs vm_args;
//各种参数
options[0].optionString= "-Djava.compiler=NONE";
options[1].optionString= "-verbose:NONE";
char achEvnPath[512] = {0};
options[2].optionString= "-Djava.class.path=/mnt/hgfs/debug/linux/webtest/";
vm_args.version=JNI_VERSION_1_6;
vm_args.options=options;
vm_args.nOptions=3;


void* dp = dlopen("libjvm.so", RTLD_LAZY ); 
if( NULL == dp )
{
printf("libjvm.so  dlopen failed!");
return false; 
}
printf("libjvm.so dlopen pass\n");
PFunCreateJavaVM funCreateJavaVM = (PFunCreateJavaVM)dlsym(dp, "JNI_CreateJavaVM");
if( NULL == funCreateJavaVM )
{
printf("libjvm.so  JNI_CreateJavaVM failed!");
return false; 
}
printf("libjvm.so JNI_CreateJavaVM pass\n");
res = funCreateJavaVM(&s_pJVM, (void**)&s_pENV, &vm_args);  

//下面一句返回空
        jclass m_pcJavaClient = m_pENV->FindClass("com/test/JavaClient");

------解决方案--------------------
引用:
我把c++程序  so 都放在/mnt/hgfs/debug/linux/webtest/目录下,还是有问题
结构如下:
/mnt/hgfs/debug/linux/webtest/
/mnt/hgfs/debug/linux/webtest/c++程序
/mnt/hgfs/debug/linux/webtest/so文件
/mnt/hgfs/debug/linux/webtest/com/test/*.class

楼主在哪里调用这个so文件,必须在java的class中才可以,而且调用jni的这个java的class也必须是在这个目录下
------解决方案--------------------
估计路径问题,你可以把so、java(全路径)、c++代码放到一起,然后把相关路径写在一起并放入环境变量
  相关解决方案