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