从jni访问ArrayList的元素

时间:2014-06-10 16:32:01

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

我正在使用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)的每个元素,我该如何得到它?请帮我!提前谢谢!

1 个答案:

答案 0 :(得分:4)

这有点过于简单化,但它应该让你开始。 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;
}