【发布时间】: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