2011-10-12 3 views
0

나는 JNI 방법을 다음과 방법을매개 변수 jobjectArray와 관련된 메모리를 해제해야합니까?

JNIEXPORT void JNICALL Java_com_android_Coordinates_Updates 
(
JNIEnv * env, 
jobject obj, 
jobjectArray coordinates 
) 
    { 
    int size = env->GetArrayLength(coordinates); 

    for(int i = 0; i < size; i ++) 
     { 
     jfloatArray row = (jfloatArray)env->GetObjectArrayElement(coordinates, i); 
     jfloat *elements = env->GetFloatArrayElements(row , 0); 

     //Do I need to release this or any other memory? 
     env->ReleaseFloatArrayElements(row , (jfloat *)elements, i); 
     } 
    } 

내 질문은 내가이 경우에 어떤 메모리를 해제해야합니까?

Java에서 JNI로 빠른 속도로 작은 데이터 (터치 좌표)를 전달하는 Android 앱이 있기 때문에이 질문을드립니다. 내 안드로이드 장치 위에 두 손가락을 빠르게 움직이면 앱이 15 초 이내에 충돌합니다. 나는 문제를 좁히려 고 애썼다. 그리고 위의 방법에서 아래의 줄을 앱에 포함 시키면 충돌이 발생했다.

jfloat *elements = env->GetFloatArrayElements(row , 0); 

답변

2

예. GetXxxxArrayElements()를 사용하여 작업을 실행 취소 한 경우 ReleaseXxxxArrayElement()를 호출해야합니다.

// why did you use "i" ? 
env->ReleaseFloatArrayElements(row , (jfloat *)elements, 0); 
// we cleanup local ref due to looping ("size" might be large!) 
env->DeleteLocalRef(row); 

배열 배열이 있습니까? 내 추측 아래 응용 프로그램 코드를 귀하의 문제에서 볼 수있는 기반으로 할 수도 있습니다, 질문에 repost 수정하십시오.

Float[] firstElement = new Float[2]; 
firstElement[0] = 1.0f; // x value 
firstElement[1] = 42.0f; // y value 

Object[] coordinates = new Object[1]; 
coordinates[0] = firstElement; 

com.android.Coordinates coordObject = new com.android.Coordinates(); 
coordObject.Updates(coordinates); 
+0

예, 자바 배열을 JNI로 전달 했으므로 각 배열을 하나씩 가져 왔습니다. –

+0

감사합니다. ReleaseFloatArrayElements의 마지막 매개 변수는 무엇입니까? –

+0

"jint mode"로 사용이 중단되었지만 실제로는 모릅니다. 확실히 색인이 아닙니다. 0 개의 반환을 확인하고 요소 "0"에 액세스하기 전에 길이 env-> GetArrayLength (row)를 확인해야합니다. 예를 들어 실제 프로젝트의 해당 부분을 잘라낼 수 있습니다. –

관련 문제