Jni的Jclass JmethodID JfrieldID的差异

 Jni的Jclass JmethodID JfrieldID


   这三者都是java类别的属性,本质上都是指标(Pointer).透过这些指标就能快速调用java类别的函数,或存取对象的属性值。在该类别被载入时,这些指标值都是有效的,一直到该类别被卸载为止。其中jmethodID和jfieldID指标可以存在C语言的全局变量中,既能跨函数共享,又能跨进程共享。


  但是,jclass通常它是局部性,其值在该函数执行完毕,就会删除掉。如果使用NewGlobalRef()将她转为全局性的,就能存于C模块的全局变量中。于是,既能跨函数共享,又能跨进程共享了。jobject的子类和jclass一样的属性类别,例如:jstring,jarray等(对象参考)。

     

  在针对JNI多线程操作的时候,在某个线程第一次进入VM去执行JNI层的c函数的时候,VM会替它诞生专属的JNIEnv对象。只要该线程还活着,就会一直保存专属它的JNIEnv对象.一个线程经常会多次进入VM去执行JNI层C函数,其中,每进入一次时,VM都会把专属的JNIEnv对象指针传递C函数的第一个参数(即env),因此,同一个线程每回进入C函数时,所带进来的env参数值都是相同的。

原文地址:https://www.cnblogs.com/fnlingnzb-learner/p/7412649.html