2014-01-30 49 views
1

我讀過這篇文章和關於如何保持C++對象的答案。Android NDK:保持活着的C++對象

Android NDK, keeping live C++ objects

但我有一些還是不明白。 我知道jlong​​可以存儲內存地址,但不是jlong​​存儲只有該C++對象的初始地址? 如果是這樣,Dalvik GC將不知道對象的內存何處結束,這意味着當我們仍然需要時,C++實例可能會被GC破壞。我怎麼能防止這種情況發生?

還是C++實例停留在沒有GC管理的本地堆的情況下,因此該對象會安全地停留在只需要顯式釋放內存函數的內存中?

回答

4

第二個是正確的。 C++對象是在本機堆中創建的,不受JVM控制。因此,垃圾收集器永遠不能訪問這些對象。即使您使用某種機制在Java中保留C++指針,它們對於Java也只是未知的jlong​​ s,而Dalvik仍不知道這些對象如何被銷燬或以其他方式操作。

+0

我見過有人說保持C++實例是不安全的,但如果它不是因爲GC和JVM而不安全,那麼不安全的因素是什麼?或者它是否安全? thx – CropP

+0

在您的Java應用程序中保留C++對象指針是不安全的,因爲本地對象可以被刪除(通過本機代碼本身),同一地址可以被完全不同的對象(可能是不同類型)重用,而Java不會知道這一點。以上不是死刑判決:您應該意識到這種不安全性,並構建一個框架,Java和本機代碼可以跟蹤和處理這些情況。還有其他棘手的情況。 –

+0

如果Java沒有注意到本地堆的更改會發生什麼?或者這些更改不僅影響本機堆?或者這個問題會造成內存不足,因爲GC不知道,所以內存不能清理? – CropP