我有一个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
后跟前者,这听起来都相当昂贵。任何建议表示赞赏。