相关疑难解决方法(0)

在JNI中,如何根据IBM的性能建议缓存类,methodID和fieldID?

在IBM上读到了这一点

要访问Java对象的字段并调用其方法,本机代码必须调用FindClass(),GetFieldID(),GetMethodId()和GetStaticMethodID().对于GetFieldID(),GetMethodID()和GetStaticMethodID(),为给定类返回的ID在JVM进程的生命周期内不会更改.但是获取字段或方法的调用可能需要在JVM中进行大量工作,因为字段和方法可能已经从超类继承,使得JVM在类层次结构中向上移动以找到它们.因为给定类的ID是相同的,所以您应该查找它们一次,然后重复使用它们.同样,查找类对象可能很昂贵,因此它们也应该被缓存.

一个人如何缓存methodID,fieldID以及class在JNI对象?是否有必须遵循的内置方法或特定程序?

java performance java-native-interface caching

21
推荐指数
2
解决办法
1万
查看次数

缓存JNI对象和线程安全(在Android中)

我正在编写一个带有本机线程(pthreads)的C++应用程序,我需要调用一些Java方法等.我不确定哪些JNI对象可以安全地缓存,即存储在我的C++对象中以供以后使用,可能/可能是由不同的线程.我知道如果我的类'方法可以被不同的线程调用,我不能缓存JNIEnv,而是缓存JavaVM并通过附加当前线程获得JNIEnv.但这是否意味着我无法缓存从JNIEnv获得的任何东西?我需要使用以下JNIEnv方法获得的对象:

FindClass,GetMethodID,NewObject,NewGlobalRef

那些在线程中保持有效,还是每次都必须获得新的?如果是后者,有没有办法在一个本机线程中创建一个对象,并且能够访问另一个线程中的同一个对象?

java-native-interface thread-safety android-ndk jnienv

3
推荐指数
1
解决办法
6031
查看次数