Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否可以缓存指向Java数组/对象的指针?_Android_Pointers_Caching_Java Native Interface - Fatal编程技术网

Android 是否可以缓存指向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

我有一个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();
}
我用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
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端数组的句柄,我将其放入引用中。