【问题标题】:JavaCPP - how to actually generate the C++ JNI wrappers?JavaCPP - 如何实际生成 C++ JNI 包装器?
【发布时间】:2018-11-21 23:15:20
【问题描述】:

我正在尝试使用 JavaCPP 为某些 C++ 库创建 java 绑定。该过程有2个方面

  • 需要构建一个 linux 共享库 (.so),其中包含本机入口点 (JNIEXPORT)。碰巧我的库只是标题,所以我只是将包含传递给 JavaCPP
  • 需要使用使用“native”关键字的方法生成 java 类,其签名对应于原生端的签名

Java“属性”文件(描述如何构建 .so 以及如何生成 Java 文件的部分)如下所示:

@Properties(
    //target = "Client",  // NOTE: with this commented, .so gets built; with it enabled, Java class gets written
    value = @Platform(
        includepath = {"jnigen/src/main/cpp/mpf"},
        include = "ClientWrapper.hpp"
    )
)
public class Mpf implements InfoMapper {
    public void map(InfoMap infoMap) {
        infoMap.put(new Info("mpf::ClientWrapper").pointerTypes("Client"));
    }
}

问题是,我无法终生生成 C++ 绑定。我知道是因为 .so 不包含入口点,所以用 nm -D X.so 查看它。如果我指定一个“目标”属性,Java 类就会被输出,这确实看起来不错,但没有.so。如果我省略了target 属性,则.so 已成功构建,但它没有绑定。我还看到它没有得到它们,通过将 -nodelete 传递给java -jar javacpp.jar 所以它保留了生成的 cpp 文件 - 它们只有内部编组代码,而不是我的东西(一个类)。

JavaCPP 文档是一场噩梦,步骤如此纠缠,我无法解决。也欢迎对替代库提出建议。谢谢。

【问题讨论】:

  • 生成 JNI 标头的命令是 javah 你运行了吗?我认为您的 java 版本可能与答案有关。这是我在 2017 年初使用的 tutorial。感谢 google 保存了我所有的历史记录。我正在使用 java 8
  • 我知道javah(或javac -h),但我的印象是JavaCPP 会为你做这件事,因为它会解析C++ 项目并生成Java 方面的东西。运行 javah 会更容易。
  • 哦,你的教程与 JavaCPP 库无关,它是准系统 JNI(我正在切换到它)。

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


【解决方案1】:

新的Mapping Recipes for C/C++ Libraries wiki 页面应该澄清这一切,但如果还有什么不清楚的地方请告诉我,我会在这里提供额外的精确度。

在这种情况下,我们可以在 Mpf 上调用 JavaCPP,并设置 @Properties(target="Client", ...) 值,创建一个名为 Client 的类,因此一系列命令如下所示:

$ javac -cp javacpp.jar Mpf.java
$ java -jar javacpp.jar Mpf
$ javac -cp javacpp.jar Client.java
$ java -jar javacpp.jar Client

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多