是否可以缓存指向Java数组/对象的指针?

时间:2016-06-24 14:42:07

标签: android pointers caching java-native-interface

我有一个Java类:

site/child-page

我在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 native void longManipulation(); } (这里只显示一个),是否可以缓存指向这些字段的指针,这样我就可以避免每次都获得一个新的指针我打电话给longManipulation()?我按照IBM best practice尝试通过界面避免过多调用。

所以我的JNI代码就像:

longManipulation()

A blog post我读到似乎暗示可以做到这一点,但由于我的知识极限并且需要一些建议,我发现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] = ... } 时都会通过将longManipulation()的字段作为参数传递并使用JavaClass获取指针或缓存GetFloatArrayElements()来获取新的指针。使用FieldID后跟前者,这听起来都相当昂贵。任何建议表示赞赏。

0 个答案:

没有答案