2012-12-26 41 views
0

我有一個使用JNI創建一個C++渲染WallpaperService.Engine的實現:Android JNI:如何實現用Java對象創建和刪除的C++對象?

引擎(JAVA) - >渲染器(C++)

如果渲染器的Java代碼,我可以簡單地陳述

private Renderer renderer = new Renderer(); 

確保渲染器是使用我的引擎創建的,並在不再需要時自動銷燬。那麼最乾淨的方法是什麼?

P.S:我在想:

int rendererId = createNativeRenderer(); 
... 
draw(rendererId); // call all native renderer methods specifying the object id 
... 
deleteNativeRenderer(rendererId); 

但由於它需要顯式刪除,這是很容易忘記它不是很優雅。

回答

0

是的,它不是很優雅,但它是迄今爲止最可靠的方法。 Java試圖成爲每個釘子的錘子,所以有這個東西叫做終結者 - 一個調用垃圾收集你的實例的Object方法。所以它理想情況下確實是你所需要的,但實際上更好地避免。如果你仔細閱讀the related Javadoc,你會發現:當您或您的代碼,認爲這是適當的

  • 您寶貴的渲染刪除代碼將不會被調用,但是當引用計數引擎決定。更糟的是,並不是在那個特定的時刻,而是在任何時候。
  • 你不知道,你不能影響,哪個線程將調用終結器。如果代碼與UI操作相關(我明白你的代碼是),那麼雙腳就會在腳上射擊。

雖然,您可以使用終結器進行安全檢查。

  1. 包裹渲染器的生命週期(創建/使用/刪除)中的對象與公共方法,用於在顯式刪除刪除
  2. ,設置一個內部標誌
  3. 倍率finalize()並檢查標誌狀態存在。如果未標記爲已刪除,則記錄惡意錯誤