2011-01-14 73 views
4

我想包裝一個C++對象,以便我可以從Java訪問它。我已經通過閱讀jni and using c++ new'ed objects in java瞭解瞭如何在我的Java包裝類中保存對我的C++對象的引用。但是我還沒有想到的一件事是如何處理我的C++對象的創建和刪除。當然,我可以引入創建和刪除我的C++對象的本地方法,但這意味着我必須在Java中自己處理內存管理......不是非常Javaish。當我的Java包裝器對象被創建並垃圾收集時,是否有任何本機方法會被調用?JNI:如何處理包裝的C++對象的創建/刪除

回答

7

你必須編寫本地方法來創建和銷燬你的C++對象。有三種不同的方法可以讓我知道如何用java調用這些方法。

  • 爲您的java對象實現public void finalize()方法。垃圾收集器將在您的對象完成後調用此方法,以便您可以在此調用destroy方法,垃圾收集器將負責處理所有事情。 finalize()有其缺點,它會減慢垃圾收集器的速度,並會從不同的線程中調用這些命名。

  • 編寫dispose()方法並手動管理您的內存。這被swing/AWT用於本地資源。這使您可以控制何時何地刪除C++對象。你仍然可以實現finalize()來停止內存泄漏/調試你的代碼。

  • 使用PhantomReference類和ReferenceQueue來檢查是否有一個對象是垃圾回收並從那裏刪除C++對象。這提供了finalize()的替代方法。