我有关于如何在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