2

我正在尝试使用 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 不包含入口点,所以用 .so 来查看它nm -D X.so。如果我指定一个“目标”属性,Java 类就会被输出,这看起来不错,但没有.so. 如果我省略target属性,则 .so 已成功构建,但它没有 bindings。我还看到它没有得到它们,通过将 -nodelete 传递给它,java -jar javacpp.jar因此它保留了生成的 cpp 文件 - 它们只有内部编组代码,而不是我的东西(一类)。

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

4

1 回答 1

1

的 C/C++ 库 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
于 2018-12-24T06:43:53.060 回答