gpt4 book ai didi

java - 处理与 JNI 的关联

转载 作者:太空宇宙 更新时间:2023-11-04 13:30:52 24 4
gpt4 key购买 nike

我对如何在 JNI 中正确处理关联(或依赖)有疑问。

假设您的共享库中有 2 个类,NativeClass1NativeClass2NativeClass1 有一个方法 void fooNative(NativeClass2* nativeObj) 允许它对 NativeClass2 类型的对象执行一些操作。

对于这些类中的每一个,都定义了一个java类来包装相应的 native 对象(JavaClass1JavaClass2,每个都有一个long 私有(private)成员分别指向 NativeClass1NativeClass2 类型的动态分配的 native 对象。

我希望 JavaClass1 也有一个方法 public void fooJava(JavaClass2 obj)(和一个相应的本地方法 private native void call_fooNative(long nativeObject1Ptr, long nativeObject2Ptr),在转换指针后最终会调用 NativeClass1::void fooNative(NativeClass2* nativeObj)

如何从 JavaClass2 获取底层长指针(指向 NativeClass2)成员以便调用 void JavaClass1::call_fooNative(long nativeObject1Ptr, long nativeObject2Ptr)(假设您传递一个指向 NativeClass1 的指针作为第一个参数)?

我想到了2种方法:

  1. 为来自 JavaClass2 的长指针创建公共(public) getter 方法。

但每个人都可以访问实际的 native 对象,创建另一个共享库,对 NativeClass2 的空指针执行 delete ptr 或在某些方面损坏 native 对象其他方式。

  1. 不是将指针传递给 NativeClass2 对象(作为 call_fooNative(...) 的第二个参数),而是传递 JavaClass2 类型的实际 java 对象 并使用 getFieldIdgetLongField 确定指针(这是私有(private)成员所允许的,如 Sheng Liang 在《Java native 接口(interface):程序员指南和规范》中所述, “10.9 违反访问控制规则”。

就设计和安全性而言,哪一种方法是正确的?

最佳答案

How you would get the underlying long pointer (to a NativeClass2) member from JavaClass2 in order to call void JavaClass1::call_fooNative(long nativeObject1Ptr, long nativeObject2Ptr) (assuming you pass a pointer of to NativeClass1 as the first parameter)?

你的第一种方法是合理的。这是SWIG使用的方法.

SWIG 是一种开源工具,可为 C++ 代码生成 Java 包装器。如果您包装了很多类或方法,您可能需要考虑使用它。

例如,这是 SWIG 生成的一些代码(类名已更改):

public class Foo {
private long swigCPtr;
protected boolean swigCMemOwn;

public Foo(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = cPtr;
}

public static long getCPtr(Foo obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}

...

But everybody could have access to the actual native object, create another shared library, perform a delete ptr on the void pointer of NativeClass2 or damage the native object in some other way.

不一定是每个人——只有 Java 和 native 代码可以访问对特定 NativeClass2 实例的引用。

  1. Instead of passing the pointer to the NativeClass2 object (as the second parameter from call_fooNative(...), pass the actual java object of type JavaClass2 and determine the pointer with getFieldId and getLongField ...

这不一定会阻止从 Java 访问指针。 Java代码可以use reflection to access private fields .

关于java - 处理与 JNI 的关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31549089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com