当本地线程与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。