【问题标题】:C++ Java wrapper construction with JNI使用 JNI 构建 C++ Java 包装器
【发布时间】:2011-06-15 08:31:29
【问题描述】:

我目前正在为 C++ 类编写 JNI 包装器,但我不确定到目前为止我所做的是否是最正确的方法。

据我了解,无法声明 Java 构造函数native,所以我最终写了如下内容:

package log;

public class Logger
{
    private long internalPtr = 0;

    private native long createNativeInstance(String application, String module, String function);

    public Logger(String application, String module, String function)
    {
        this.internalPtr = createNativeInstance(application, module, function);
    }

    public native String getApplication();

    static { System.loadLibrary("log_java"); }
}

基本上,我的internalPtr 字段包含指向我的底层C++ 实例的指针,我使用static native 方法createNativeInstance() 在纯Java 构造函数中创建它。

这是正确的做事方式吗?

另一个我可以得到答案的问题是:“我应该如何处理释放?”

我的 Java 技能非常有限,因此请不要犹豫,提出更“明显”的解决方案。

非常感谢。

【问题讨论】:

  • 检查 JNA,可能更容易开始。

标签: java c++ java-native-interface wrapper


【解决方案1】:

这就是我一直实现封装 C/C++ 对象的本机类的方式。我认为编写原生构造函数可能有点痛苦,所以从未尝试过。

对于取消分配,您要做类似的事情。编写一个 C/C++ 函数,为您的 C/C++ 对象取消分配内存,然后从 java 析构函数(finalise 方法)调用它。所以是这样的:

private native void destroyNativeInstance( long p_internalPtr );

public void finalize()
{
    destroyNativeInstance( this.internalPtr );
}

【讨论】:

  • 它看起来是一个优雅的解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 2015-10-21
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多