【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暂且无法跟踪错误定位。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值