2014-06-10 116 views
1

我正在使用android NDK,在java中,我將一個arrayList傳遞給該方法。它看起來像:從jni訪問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(列表),我如何得到這個?請幫幫我!提前致謝!

回答

4

這有點過分簡單化了,但它應該讓你開始。 ArrayList只是對象,你不需要擔心JNI中的泛型。只需找到你想要調用的方法,檢查並確保JNI找到它們,然後調用該方法ID。本地數組需要通過GetDoubleArrayElements調用轉換爲JNI。你應該閱讀雖然DOC的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; 
} 
+3

它的安全調用'JCLASS ArrayList_class =(* ENV) - > GetObjectClass(ENV,OBJ)' –