我有關於如何在JNI中正確處理關聯(或依賴關係)的問題。處理與JNI的關聯
讓我們假設在你的共享庫中你有2個類,NativeClass1
和NativeClass2
。 NativeClass1
有一個方法void fooNative(NativeClass2* nativeObj)
,它允許它用NativeClass2
類型的對象執行一些操作。
對於每個類,Java類被定義爲包相應的天然對象(JavaClass1
和JavaClass2
,每一個具有long
私有成員分別指向NativeClass1
類型和NativeClass2
的一個動態分配的本地對象,)。
我想JavaClass1
也有一個方法public void fooJava(JavaClass2 obj)
(以及相應的本地方法private native void call_fooNative(long nativeObject1Ptr, long nativeObject2Ptr)
其鑄造指針後最終將調用NativeClass1::void fooNative(NativeClass2* nativeObj)
)。
你將如何獲得潛在的長指針(到NativeClass2
)成員從JavaClass2
爲了調用void JavaClass1::call_fooNative(long nativeObject1Ptr, long nativeObject2Ptr)
(假設你傳遞給NativeClass1
的指針作爲第一個參數)?
我想到的2種方法:
- 創建從
JavaClass2
長指針一個公共的getter方法。
但每個人都可以有機會獲得實際的原生對象,創建另一個共享庫,對NativeClass2
的空指針進行delete ptr
或以其他方式破壞原生ojbect。
- 代替使指針
NativeClass2
對象(如從call_fooNative(...)
第二個參數,通JavaClass2
類型的實際的Java對象,並使用getFieldId
和getLongField
確定指針(其permited一個私有成員上,如Java本機接口說:程序員指南和規格盛梁啓超「10.9違反訪問控制規則」
哪一個會在設計和安全方面的正確方法
?
好吧,那我就用我的第一個方法去。謝謝你的細節! – danimihalca