废话前言:
关于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暂且无法跟踪错误定位。