【CPP/JAVA】关于C/C++调用java的JNI的方法以及库路径问题

废话前言:

关于C/C++调用java的JNI的方法,大体有两种办法一是采取LOADLIBRARY函数,动态加载jvm.dll的方式,这一点资料很多这里不再详叙,另外一种是引入头文件及jvm.dll的方式,这个网上提到的很少。

针对引入jvm.dll的方式,以WINDOWS为例,主要有以下坑点需要避开

1.jvm.dll所依赖的./bin/client/ 和./lib两个路径需要加入PATH变量,否则会提示

Error occurred during initialization of VM

Unable to load native library: Can't find dependent libraries

2.调用java的路径问题

需要在jvm的启动参数中加入下述内容,点号为当前主程序目录,需要修改对应的位置否则会出现错误

"-Djava.class.path=.;./****"

3.jvm.dll的问题,需要选择对应编译版本

这一点容易忽视,如mingw,vs 不同编译器要采用不同的版本,如果调用错误,一般在编译环节就会提示找不到链接符号的错误

4.线程绑定以及安全销毁jvm

同一进程(线程)只能对jvm实例化一次,因此二次实例化的时候会出现错误,在实例化之前可先取回jvm的实例,下面以C++操作为例

//取回线程中的jvm实例
JNI_GetCreatedJavaVMs(&mJvm,10,NULL);

//实例为空则创建实例
if(mJvm==NULL)
   JNI_CreateJavaVM(&mJvm, (void**)&mJvmEnv, &vmInitArgs);

//销毁实例
mJvm->DestroyJavaVM()

5.首次创建实例出现segment fault的问题

创建jvm实例的时候会出现内存段错误的问题,这个错误可能是调用jvm初始化参数不当造成的。

debug的时候会提示下述错误,因为没办法debug暂且无法跟踪错误定位。

【CPP/JAVA】关于C/C++调用java的JNI的方法以及库路径问题_第1张图片

你可能感兴趣的:(CSDN精华,Bugs修复,java,c++,jvm)