在使用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。