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。
首先,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。
相关文章推荐
- linux下使用jni实现c++调用java程序(2)找不到java类的问题
- linux下使用jni实现c++调用java程序(5)参考资料总结
- linux下使用jni实现c++调用java程序(1)准备工作
- linux下使用jni实现c++调用java程序(3)多线程jni使用
- JNI实现Java调用C++程序(Linux 64位)
- cocos2dx 使用jni实现java调用c++
- 使用JNI技术实现JAVA程序调用dll
- 用Swig将c/c++程序转为java代码(使用swig实现java调用c、c++的方法)
- linux下 使用JNI 来以C++调用JAVA的类!(一)
- 【转载整理】eclipse 开发c/c++、Java使用JNI调用C程序、生成64位dll动态链接库
- 使用JNI技术实现JAVA程序调用dll
- JNI实现Java调用C++程序(Win10 64位)
- 使用JNI技术实现JAVA程序调用dll
- linux下 使用JNI 来以C++调用JAVA的类!(一)
- 使用Java中的JNI技术将C/C++程序嵌入到Java代码中实现Hello World
- 【Java】Java调用C/C++程序的实现(jni)
- Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能
- cocos2dx 使用jni实现java调用c++
- 使用JNI实现java调用c++
- java程序调用C、C++动态库的几种实现方式,即JNI的应用方式