2012-08-28 2 views
0

내 애플리케이션은 일부 원시 코드가있는 Android 앱입니다.JNI에서 jobject를 갱신 할 수 없습니다.

Java 코드는 새 스레드 (새 Runnable)를 통해 스레드를 시작하고 원시 코드에서 AttachCurrentThread를 통해 해당 스레드를 JVM에 연결합니다.

그 스레드에서 호출되는 네이티브 함수는 간단한 이벤트 (부울 변수)를 수신하고 적절한 JNIEnv 포인터를 사용하여 jobject가 Java 측에서 2 개의 Java 변수를 채우는 또 다른 네이티브 함수를 호출하는 무한 루프입니다. void를 호출 해 데이터를 표시합니다. 그 루프의 이유는 함수를 정상적으로 호출하기위한 오버 헤드 (할당과 파기가 많음)가 가장 큰 것입니다.

유일한 문제는 JNIEnv 포인터를 갱신 할 수 있지만 jobject에 대한 작업을 수행 할 수 없다는 것입니다.

그리고하는 jobject에 의해 내가 좋아하는 함수 호출을 통해 네이티브 코드에 전달되는하는 jobject 의미는 그래서

jint Java_com_example_example_MainActivity_NativeFunc(JNIEnv* env, 
               jobject obj) 
{ 
    return; 
} 
+2

네이티브 코드에서 개체에 대한 참조를 유지하려는 경우 새 전역 참조 또는 새로운 약한 전역 참조를 만들어 참조를 명시 적으로 유지해야하며 나중에 해제해야 할 수도 있습니다. 후자의 경우, 사용하기 전에 동등성이 null인지 점검해야합니다. – technomage

+0

"갱신"으로 다른 것을 의미한다면, AFAIK "갱신"은 자바의 표준 용어가 아니기 때문에 설명하십시오. – technomage

답변

1

자바 코드는 기본에, 새로운 스레드를 통해 스레드 (새의 Runnable를) 시작 코드, 나는 그 스레드를 AttachCurrentThread를 통해 JVM에 첨부한다.

Java 코드로 작성된 스레드에는 JVM을 첨부 할 필요가 없습니다. 이미 첨부되어 있습니다.

질문을 올바르게 이해했다면 jobject을 얻고 나중에 다른 원시 메소드에서 해당 객체에 액세스하려고합니다. 이 작업을 수행하려면 NewGlobalRef을 사용할 수 있습니다 : 당신은 글로벌 C에서 jobject/C++ 변수를 저장하고 나중에 사용할 수 있습니다

jobject myGlobalReference = env->NewGlobalRef(obj); 

. JVM이 죽거나 DeleteGlobalRef이라는 참조를 삭제할 때까지 유효합니다. 전역 참조를 삭제하지 않는 한 모든 Java 참조가 사라지면 가비지 수집은을 참조하는 객체를 수집하지 않습니다.

관련 문제