Android 是否可以缓存指向Java数组/对象的指针?
我有一个Java类:Android 是否可以缓存指向Java数组/对象的指针?,android,pointers,caching,java-native-interface,Android,Pointers,Caching,Java Native Interface,我有一个Java类: public class JavaClass { private static int id; private static float[] array; public JavaClass() { this.id = 0; this.array = new float[10]; } public native void initialiseCached(); public nati
public class JavaClass {
private static int id;
private static float[] array;
public JavaClass() {
this.id = 0;
this.array = new float[10];
}
public native void initialiseCached();
public native void longManipulation();
}
我用Java实例化了它,并想使用对成员静态数组(这里只显示了一个)进行操作的longManipulation()
,是否可以缓存指向这些字段的指针,以避免每次调用longManipulation()
?我正试图避免过多的调用通过接口根据
因此,我的JNI代码类似于:
static jclass JC_class;
static jint* ptr_id;
static jfloat* ptr_array;
Java_my_package_name_initialiseCached(JNIEnv* env, jobject instance) {
JC_class = (jclass)env->NewGlobalRef(env->FindClass("my/package/name/JavaClass"));
// Get pointer to id field and store in static variable which should
// remain while library is loaded.
ptr_id = (jint*)env->GetStaticObjectField(JC_class,
env->GetStaticFieldID(JC_class, "id", "I"));
// Get pointer to head of array and store
ptr_id = env->GetFloatArrayElements(
(jint*)env->GetStaticObjectField(
JC_class, env->GetStaticFieldID(JC_class, "array", "[F")
)
);
}
// Then called at some later time //
Java_my_package_name_longManipulation(JNIEnv* env, jobject instance) {
// Use pointer without interfacing with Java again
ptr_array[0] = ...
}
我的阅读似乎表明这是可以做到的,但由于我的知识有限,我发现JNI非常喜怒无常,需要一些建议。另一种方法是每次调用
longManipulation()
时获取一个新指针,方法是将JavaClass
的字段作为参数传入,并使用GetFloatArrayElements()
获取指针,或者缓存FieldID
并使用GetStaticObjectField()获取指针
其次是前者,听起来都相当昂贵。非常感谢您的建议。缓存jmethodID
/jfieldID
也可以。对于对象/类引用,例如jclass
或jfloatArray
,如果要缓存该引用,必须使用NewGlobalRef
获取全局引用。确保在不再需要该全局引用时将其删除。当然,在每次JNI调用后检查错误的返回值和异常。@Michael,谢谢你的回复。那么,是否有可能获得指向如下数组字段的持久指针:ptr\u id=env->NewGlobalRef(env->GetFloatArrayElements((jint*)env->GetStaticObjectField(JC\u类,env->GetStaticFieldID(JC\u类,array,“[F”));
?NewGlobalRef
需要一个jobject
,而GetFloatArrayElements
通常被强制转换为jxxxx
的指针,其中xxxx
是一个基本类型。我希望它能返回一个我将放入引用中的Java端数组句柄。缓存jmethodide
jclass
或jfloatArray
如果要缓存该引用,则必须使用NewGlobalRef
获取全局引用。请确保在不再需要该全局引用时删除该全局引用。当然,还要检查错误的返回值和每次JNI调用后的概念。@Michael,谢谢你的回复。那么是否可以获得一个指向如下数组字段的持久指针:ptr\u id=env->NewGlobalRef(env->GetFloatArrayElements((jint*)env->GetStaticObjectField(JC\u类,env->GetStaticFieldID(JC\u类,array),“[F”)));
?NewGlobalRef
需要一个jobject
,而GetFloatArrayElements
通常被强制转换为jxxxx
的指针,其中xxxx
是一个基本类型。我希望它能返回一个Java端数组的句柄,我将其放入引用中。