JNI 메소드를 사용하여 Java 객체를 빌드 할 때 Java 메소드에 매개 변수로 전달하기 위해 JNI 호출 API를 사용하여 호출합니다. 어떻게 관리합니까? 기억? 내가 free()
이 더 복잡 소멸자 방법이있는 C 개체가Invocation API를 사용하는 JNI 메모리 관리
:
는 여기에 내가 함께 일하고거야. 이 C 객체는 Java 객체와 연관되어 있어야하며 Java 객체로 응용 프로그램을 끝내면 C 객체가 더 이상 필요하지 않습니다. 그래서, 내가 instance
에 끝났어요 지금, 내가 무엇을
c_object = c_object_create();
class = (*env)->FindClass (env, "my.class.name");
constructor = (*env)->GetMethodID (env, class, "<init>", "(J)V");
instance = (*env)->NewObject (env, class, constructor, (jlong) c_object);
method = (*env)->GetMethodID (env, other_class, "doSomeWork", "(Lmy.class.name)V");
(*env)->CallVoidMethod (env, other_class, method, instance);
해야합니까
:내가 너무 (오류 명확성을 위해 생략 검사)처럼 자바 객체를 생성 무엇입니까? 이상적으로는 가비지 수집을 VM에 맡기고 싶습니다. instance
으로 끝났을 때 내가 제공 한 포인터에 c_object_destroy()
을 호출하면 환상적입니다. 이것이 가능한가?
이와 관련하여 별도의 질문은 이와 같은 방법으로 작성한 Java 엔티티의 범위와 관련이 있습니다. class
, constructor
또는 method
을 수동으로 출시해야합니까? JNI의 문서는 적절하게 메모리를 관리한다는 주제로 좌절감을 표시합니다.
그것은 분명히, 유감스럽게도 필요한 특정 측면입니다 :) valgrind (리눅스 메모리 검사 도구)에서 JVM을 실행하려고 시도했는지는 모르겠지만 너무 많은 용의자 작업을 읽는 것은 불가능합니다. 출력, 그래서 메모리 할당 작업에 대한 명확한 의사 결정이 중요합니다. –
사실, 나는 가지고 있습니다. Valgrind에서 Eclipse를 실행하려고 시도했지만 실패했습니다. http://stackoverflow.com/questions/189284/running-eclipse-under-valgrind. – JesperE