【问题标题】:Access ArrayList's element from jni从 jni 访问 ArrayList 的元素
【发布时间】:2014-06-10 16:32:01
【问题描述】:

我正在使用 android NDK,在 java 中,我将 arrayList 传递给该方法。它看起来像:

public static native float[] computeFeatures(ArrayList<double[]> list); 

我正在使用javah生成头文件,在C++中,这个方法已经转换成:

JNIEXPORT jfloatArray JNICALL Java_khoa_cspdemo_Main_computeFeatures(JNIEnv *env,
    jclass jc, jobject obj);

现在,在 C++ 代码中,我想访问 ArrayList (list) 的每个元素,我如何得到这个?请帮我!提前致谢!

【问题讨论】:

    标签: android android-ndk java-native-interface native


    【解决方案1】:

    这有点过于简单化了,但它应该可以帮助您入门。 ArrayList 只是对象,您无需担心 JNI 中的泛型。只需找到您要调用的方法,检查并确保 JNI 找到它们,然后调用该方法 id。本机数组需要通过 GetDoubleArrayElements 调用转换为 JNI。你应该阅读Get<PrimitiveType>ArrayElements Routines的文档

    JNIEXPORT jfloatArray JNICALL Java_khoa_cspdemo_Main_computeFeatures(JNIEnv *env, jclass jc, jobject obj) {
        jclass ArrayList_class = (*env)->FindClass(env, "java/util/ArrayList");
        ArrayList_add_id = (*env)->GetMethodID(env, ArrayList_class, "add", "(Ljava/lang/Object;)Z");
    
        const long int buf[] = { 0, 1, 2, 3, 42 };
    
        jboolean isCopy;
        jdouble *jbuf = (*jenv)->GetDoubleArrayElements(env, buf, &isCopy);
    
        (*env)->CallBooleanMethod(env, obj, ArrayList_add_id, jbuf);
    ...
        (*jenv)->ReleaseDoubleArrayElements(jenv, buf, jbuf, 0);
    
    
        return JNI_OK;
    }
    

    【讨论】:

    • 拨打jclass ArrayList_class = (*env)-&gt;GetObjectClass(env, obj)更安全
    猜你喜欢
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2020-07-15
    • 2017-08-07
    • 2015-02-21
    • 2020-07-21
    相关资源
    最近更新 更多