JavaCPP-如何实际生成C ++ JNI包装器?

时间:2018-11-21 23:15:20

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

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

  • 需要构建一个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查看它。如果指定“ target”属性,则输出Java类,确实看起来不错,但没有.so。如果我忽略了target属性,则.so已成功构建,但它没有绑定。我还看到,通过将-nodelete传递给java -jar javacpp.jar使其保持生成的cpp文件,它们还没有得到它们-它们内部仅具有编组代码,而没有我的东西(一个类)。

JavaCPP文档是一场噩梦,而且步骤如此复杂,以至于我无法解决。也欢迎提供替代库的建议。谢谢。

1 个答案:

答案 0 :(得分:0)

新的Mapping Recipes for C/C++ Libraries维基页面应该澄清所有这些,但是请让我知道是否还有任何不清楚的地方,我将在此处提供更多的精度。

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

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