2013-05-18 9 views
7

Zwracam łańcuch znaków z metody JNI. Usuwam lokalne odwołanie do niego przed zwróceniem wartości.Wywołanie DeleteLocalRef w macierzystym interfejsie java

JNIEXPORT jstring JNICALL TestJNIMethod(JNIEnv* env, jclass) 
{ 
    jstring test_string = env->NewStringUTF("test_string_value"); 
    env->DeleteLocalRef(test_string); 
    return test_string; 
} 

Czy wywołująca metoda JAVA nadal będzie mogła uzyskać dostęp do zwróconego łańcucha lub czy moduł czyszczenia pamięci będzie czyścił pamięć?

Odpowiedz

18

Nie, nie będzie, jednak Twój kod będzie działał w wersjach Androida wcześniej niż ICS. Z ICS na tym kodzie poprawnie się nie powiedzie.

Ogólnie nie trzeba usuwać lokalnych odniesień, gdy funkcja JNI powróci do Javy, odwołania otrzymają GC.

Wyjątkiem od tej reguły jest sytuacja, gdy tworzy się ich dużo, być może w pętli. Następnie można wypełnić lokalną tabelę odniesienia. Zobacz IBM: Overview of JNI object references.

Powinieneś przeczytać JNI Local Reference Changes in ICS. Nawet jeśli nie piszesz do Androida, wciąż identyfikuje wiele typowych błędów.

Powiązane problemy