我在IBM上读到了这一点
要访问Java对象的字段并调用其方法,本机代码必须调用FindClass(),GetFieldID(),GetMethodId()和GetStaticMethodID().对于GetFieldID(),GetMethodID()和GetStaticMethodID(),为给定类返回的ID在JVM进程的生命周期内不会更改.但是获取字段或方法的调用可能需要在JVM中进行大量工作,因为字段和方法可能已经从超类继承,使得JVM在类层次结构中向上移动以找到它们.因为给定类的ID是相同的,所以您应该查找它们一次,然后重复使用它们.同样,查找类对象可能很昂贵,因此它们也应该被缓存.
一个人如何缓存的methodID,fieldID以及class在JNI对象?是否有必须遵循的内置方法或特定程序?
我正在编写一个带有本机线程(pthreads)的C++应用程序,我需要调用一些Java方法等.我不确定哪些JNI对象可以安全地缓存,即存储在我的C++对象中以供以后使用,可能/可能是由不同的线程.我知道如果我的类'方法可以被不同的线程调用,我不能缓存JNIEnv,而是缓存JavaVM并通过附加当前线程获得JNIEnv.但这是否意味着我无法缓存从JNIEnv获得的任何东西?我需要使用以下JNIEnv方法获得的对象:
FindClass,GetMethodID,NewObject,NewGlobalRef
那些在线程中保持有效,还是每次都必须获得新的?如果是后者,有没有办法在一个本机线程中创建一个对象,并且能够访问另一个线程中的同一个对象?