簡體   English   中英

JNI訪問的代碼中的純C ++對象

[英]Plain C++ objects in code accessed by JNI

我的Android應用程序具有本機C ++層和Java層。 Java層通過JNI調用訪問本機層。

C ++層可以安全地創建供內部使用的C ++對象,並將其存儲在C ++成員變量中嗎? 我說的是C ++對象,它不需要以任何方式被Java代碼訪問,即它們在C ++層中被完全管理和刪除。 換句話說,可以通過多個JNI調用訪問同一對象(通過成員變量),但是只有C ++層需要訪問它。

在這件事上,我需要確認,因為我知道有特殊的JNI方法來處理對象(相關術語:本地引用,全局引用等)。 如果我是對的,那么它們僅適用於Java代碼可見(或為Java代碼創建)的對象。

因此,我想可以以通常的方式(例如newdelete )創建和刪除僅本機的C ++對象,而Java不需要了解它們。 只要對象和對它們的任何引用僅位於C ++層,就不需要特殊的互操作性考慮。 這個對嗎? 我可以在該層中以與普通C ++應用程序相同的方式定義C ++類和方法,而沒有任何JNI / Java互操作性嗎? 一般來說,是否允許實例化和存儲純C ++對象,即超出Dalvik / JVM權限的對象?

實際上,用於處理對象的JNI方法是針對Java對象的

您可以用您可以想象的任何方式(malloc / new)創建C / C ++對象,但是:如何在JNI調用中保留它們? (當然,如果需要的話。)兩種選擇:

  1. 將指針轉換為整數,然后將該整數傳遞給Java。 (您將不得不關心存儲在垃圾收集的Java對象中的指針,您會發現,整數並不意味着釋放本機內存。)

  2. 具有一些C / C ++數據結構以及所有必需的參考。

線程安全性值得單獨考慮; 如果您嘗試將指針存儲在線程局部變量中,則可能永遠不會調試代碼(您會發現生命周期不匹配)。

僅從一個線程訪問的靜態全局變量可以達到良好的效果。

請記住,Android可能會殺死並重新啟動您的應用程序進程,從而破壞存儲在靜態變量中的所有內容以及本機數據結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM