gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:54:44 52 4
gpt4 key购买 nike

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

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

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

JavaCPP文档简直是噩梦,步骤纠结,搞不定。也欢迎对替代库提出建议。谢谢。

最佳答案

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

在这种情况下,我们可以使用 @Properties(target="Client", ...) 值集在 Mpf 上调用 JavaCPP,创建一个名为 Client,所以这一系列命令看起来像这样:

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

关于JavaCPP - 如何实际生成 C++ JNI 包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53421770/

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