2011-01-14 5 views
4

Java에서 액세스 할 수 있도록 C++ 객체를 래핑하고 싶습니다. jni and using c++ new'ed objects in java을 읽음으로써 Java 래퍼 클래스에서 내 C++ 객체에 대한 참조를 저장하는 방법을 이해했습니다. 내가 알아 내지 못한 한 가지 방법은 내 C++ 객체의 생성과 제거를 처리하는 것입니다. 물론, 나는 C++ 객체를 생성하고 삭제하는 네이티브 메소드를 소개 할 수있다. 그러나 이것은 Java에서 메모리 관리를 직접 처리해야한다는 것을 의미한다. 자바 래퍼 객체가 생성되고 가비지 수집 될 때 호출되어야하는 구현해야하는 네이티브 메소드가 있습니까?JNI : wrapped C++ 객체의 생성/제거를 처리하는 방법

답변

7

C++ 객체를 만들고 파괴하기위한 원시 메소드를 작성해야합니다. 내가 자바로 그걸 부를 수있는 방법을 아는 3 가지 다른 방법이있다.

  • Java 객체에 대해 public void finalize() 메소드를 구현하십시오. 가비지 컬렉터는 일단 객체가 마무리되면이 메소드를 호출하여 여기에서 destroy 메소드를 호출하면 가비지 컬렉터가 모든 것을 처리합니다. finalize()에는 단점이 있습니다. 가비지 컬렉터가 느려지고 다른 스레드에서 약간 호출하도록 호출됩니다.

  • dispose() 메서드를 작성하고 수동으로 메모리를 관리하십시오. 네이티브 리소스에 대해 swing/AWT에 의해 사용됩니다. 이렇게하면 언제 어디서 C++ 객체가 삭제되는지 제어 할 수 있습니다. finalize()를 구현하여 메모리 누수를 막거나 코드를 디버깅 할 수 있습니다.

  • PhantomReference 클래스와 ReferenceQueue을 사용하여 개체 중 하나가 가비지 수집되었는지 확인하고 거기에서 C++ 개체를 삭제하십시오. 이것은 finalize()에 대한 대안을 제공합니다.

관련 문제