gpt4 book ai didi

java - 我可以使用 JNI 在 Java 代码中引用 C++ 对象吗?

转载 作者:IT老高 更新时间:2023-10-28 23:14:14 34 4
gpt4 key购买 nike

我在任何地方都没有看到这个(或者我只是简单地没有看到它)但是有没有办法使用 JNI 来返回 c/c++ 对象并在 java 中使用该对象?

例如(很简单):

class simpleClass{
...
private:
int intVar;
public:
int getIntVar();
void setIntVar(int someNum);
...
}

在我的 java 代码中,我将如何做这样的事情:

...
simpleClass sc = new simpleClass();
sc.setIntVar(9);
System.out.println(sc.getIntVar());
...

我意识到这是一个非常简单的示例,但我只是在寻找概念——我想到的 C++ 类非常大,我希望避免创建大量的包装方法...

如果不可能,那也没关系,只是希望节省几天的编码时间,哈哈

最佳答案

Java 版本的 SimpleClass 应该做两件事。一,保留一个私有(private)的 long 值,该值将 C++ 指针的值存储到后备 native 对象(您可能必须使用 BigInteger,具体取决于 native 指针的大小 - unsigned long long?)。二、将公共(public)方法(例如setIntVal)设为native。

public class SimpleClass {
private long nativePtr;

public SimpleClass() {
nativePtr = initNativeSimpleClass();
}

public void destroy() {
destroyNativeSimpleClass();
nativePtr = 0L;
}

protected void finalize() throws Throwable {
destroyNativeSimpleClass();
nativePtr = 0L;
}

public native int getIntVal();
public native void setIntVal(int val);

private native long initNativeSimpleClass();
private native void destroyNativeSimpleClass();
}

然后在您的 JNI 代码中实现这些本地方法。 initNativeSimpleClass() 方法将new SimpleClass 的后备C++ 实例。 destroyNativeSimpleClass() 方法将删除该实例。访问器方法将使用 nativePtr 的值,将其转换为真正的指针,并对 native 支持实例执行适当的操作。

这个习惯用法确实存在内存泄漏的风险,因为该类的用户必须在使用完实例后调用 destroy。如果他们不这样做,则支持的 native 实例可能不会被正确销毁。正如我在示例中所示,您可以覆盖 finalize 以调用 native 销毁器函数,但所有关于如何不能依赖 finalize 的警告仍然适用。通过在销毁时将 nativePtr 值设置为 0,您可以避免在多次调用 destroy 时出现段错误(在 C++ 中删除 NULL 是安全的)。

关于java - 我可以使用 JNI 在 Java 代码中引用 C++ 对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10212851/

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