您的位置:首页 > 运维架构 > Linux

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

2013-03-09 22:38 916 查看
在使用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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: