JNI学习之Invocation API(二)

2014-11-24 12:27:04 · 作者: · 浏览: 2
经与VM建立关联,多次调用本方法是安全的。本地线程在同一时段内,只能与一个VM对象建立关联关系(这个说法很奇怪,之前的资源提示在单个进程内,只允许创建一个VM,这里为什么又提示说避免与多个VM关联?)。
当本地线程与VM建立关联之后,线程使用的上下文类加载器将是VM的启动类加载器。

调用本方法时,第一个参数为指向VM对象的指针,第二个参数为JNIEnv类型对象的指针,第三个参数为JavaVMAttachArgs类型对象的指针,但没有实际用途,应当为设置为NULL(不过原文档对这个参数的介绍稍有点混乱,需要实际验证一下)。

AttachCurrentThreadAsDaemon

签名jint AttachCurrentThreadAsDaemon(JavaVM* vm, void** penv, void* args);

用法和参数与AttachCurrentThread方法类似,区别在于VM内部创建的java.lang.Thread对象将会是一个daemon。如果当前本地线程已经和VM建立关联,则多次调用AttachCurrentThread或者AttachCurrentThreadAsDaemon并不会修改java.lang.Thread对象的daemon属性。

DetachCurrentThread

签名jint DetachCurrentThread(JavaVM *vm);

当前线程与VM解除关联,本地线程持有的锁对象将全部释放。等待当前线程的Java线程将得到通知。主线程通过调用本方法,可以和VM解除关联。

GetEnv

签名为jint GetEnv(JavaVM *vm, void **env, jint version);

通过调用本方法,可以获取到当前线程的JNIEnv对象。如果当前线程与VM没有建立关联,则*env被设置为NULL,同时返回JNI_EDETACHED;如果传入的VM特性版本号不被支持,则*env被设置为NULL,同时返回JNI_EVERSION;如果调用成功,则*env被设置为正确的JNIEnv对象指针,同时返回JNI_OK。