我想包裝一個C++對象,以便我可以從Java訪問它。我已經通過閱讀jni and using c++ new'ed objects in java瞭解瞭如何在我的Java包裝類中保存對我的C++對象的引用。但是我還沒有想到的一件事是如何處理我的C++對象的創建和刪除。當然,我可以引入創建和刪除我的C++對象的本地方法,但這意味着我必須在Java中自己處理內存管理......不是非常Javaish。當我的Java包裝器對象被創建並垃圾收集時,是否有任何本機方法會被調用?JNI:如何處理包裝的C++對象的創建/刪除
4
A
回答
7
你必須編寫本地方法來創建和銷燬你的C++對象。有三種不同的方法可以讓我知道如何用java調用這些方法。
爲您的java對象實現
public void finalize()
方法。垃圾收集器將在您的對象完成後調用此方法,以便您可以在此調用destroy方法,垃圾收集器將負責處理所有事情。 finalize()有其缺點,它會減慢垃圾收集器的速度,並會從不同的線程中調用這些命名。編寫dispose()方法並手動管理您的內存。這被swing/AWT用於本地資源。這使您可以控制何時何地刪除C++對象。你仍然可以實現finalize()來停止內存泄漏/調試你的代碼。
使用PhantomReference類和ReferenceQueue來檢查是否有一個對象是垃圾回收並從那裏刪除C++對象。這提供了finalize()的替代方法。
相關問題
- 1. Android JNI:如何實現用Java對象創建和刪除的C++對象?
- 2. SWIG包裝從Python創建的C++對象過早刪除
- 3. 如何從C++/CLI中處理/刪除管理對象
- 4. 刪除處理程序處理對象
- 5. PyQt的:RuntimeError:包裝的C/C++對象已被刪除
- 6. 如何用JNI創建對象?
- 7. 需要刪除對象:實現在函數中處理或創建對象?
- 8. 如何創建一個C#會話對象包裝?
- 9. 在C/C++中創建已包裝庫的Python對象?
- 10. 如何創建處理異步數據傳輸的包裝?
- 11. 刪除動態創建的對象
- 12. 創建對象是刪除舊的?
- 13. 刪除在DLL中創建的對象
- 14. 如何在處理對象後創建對象?
- 15. 如何刪除C++中的對象?
- 16. 如何封裝一個C++ lambda,它可以刪除它的「包含」對象嗎?
- 17. 如何刪除動態創建的事件處理程序?
- 18. 正確處理領域對象刪除
- 19. 對象的C#包裝
- 20. JNI:如何刪除本地參考C++
- 21. JNI對象的創建和存儲管理
- 22. 創建庫的包裝c#
- 23. 刪除的JNI
- 24. 如何處理在C#中的類的方法中創建的對象#
- 25. 如何處理MFC中動態創建的對象的事件?
- 26. BOOL包裝?創建一個「BOOL」值的對象。 (Objective-C)
- 27. 如何使用Corona SDK有效地處理對象的對象刪除
- 28. 如何刪除文件處理C++中
- 29. 如何刪除在C++的本地函數中創建的對象?
- 30. 在C++中爲C風格對象創建透明包裝類