2014-06-10 2 views
1

Java에서 android NDK로 작업하고 있는데, java에서는 메소드에 arrayList를 전달합니다. 그것은 같이됩니다 : C++ 코드에서, 내가의 각 요소에 액세스하려면,jni의 ArrayList 요소에 액세스

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

지금 : 내가 헤더 파일 및 C++에서 발생하는 javah가 사용하고

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

,이 방법으로 전환하고있다 ArrayList (목록), 어떻게해야합니까? 제발 도와주세요! 미리 감사드립니다!

답변

4

이것은 약간 지나치게 단순화되었지만 시작해야합니다. ArrayList는 객체 일 뿐이므로 JNI의 제네릭에 대해 걱정할 필요가 없습니다. 호출하고 싶은 메소드를 찾아, JNI가 그 메소드를 찾았는지 확인하고 확인한 다음, 그 메소드 id를 호출하십시오. 원시 배열은 GetDoubleArrayElements 호출을 통해 JNI로 변환되어야합니다. 당신은 JCLASS ArrayList_class = (* ENV)`호출 안전합니다 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

의 문서 불구하고 읽어야 -> GetObjectClass (ENV, OBJ)' –