linux下使用jni实现c++调用java程序(4)DestroyJavaVM出现错误

在使用c++多线程程序时,本来以为可以每个线程单独生成一个jvm虚拟机,在虚拟机上调用完java类,最后销毁,但后来发现这是行不通的:
首先, JNIEnv *env指针和 jobject对象都不能跨线程使用
其次, jvm可以多线程共享,但是只有主线程可以销毁虚拟机

卸载 Java 虚拟机并回收资源:
jint DestroyJavaVM(JavaVM *vm);   
说明:
只有主线程能够卸载虚拟机。调用 DestroyJavaVM() 时,主线程必须是唯一的剩余用户线程。
DestroyJavaVM是非强制性的,也就是说在没有非守护线程的时候DestroyJavaVM才可能成功。

在使用jni时,虚拟机加载需要消耗时间和资源,so使用时应养成好的习惯:
虚拟机加载应该是只有一次,以后只要GetJavaVM就可以,

不应该把虚拟机的创建和初始化,以及卸载放到普通类的方法或者类中,最好放在主函数中,

如果要实现跨线程调用jni接口,我们需要先调用jni.h中的GetJavaVm函数,就可以获得已经create并init的JVM

每个线程调用java类之前,记得调用AttachCurrentThread()来确保它确实attach到Java环境里了,

当没有剩余线程时,才可以销毁JVm。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值