从C ++头文件生成Java接口

时间:2011-05-31 16:42:21

标签: java maven-2 interop native jna

我们需要一些专有的库来与之交互。这些库是Windows DLL或Linux .so文件。我们得到了标题来定义接口。由于我从未对本机库进行任何操作,因此我查看了JNAerator(http://code.google.com/p/jnaerator/)以及BridJ和JNA的内容。

使用C ++头文件和编译的lib生成接口的简单方法是什么?例如,通常采用JNA,例如:

SomeDLL lib = (SomeDLL) Native.loadLibrary("some_dll", SomeDLL.class);

我必须将DLL保留在某处:如何将DLL与Jar捆绑在一起?我使用Maven构建Jar文件......但Native.loadLibrary接口不允许直接指定路径。

2 个答案:

答案 0 :(得分:2)

JNI编码通常是编写C ++代码以创建本机粘合方法的手动过程。有一本书可以解释它。

在某些情况下,http://jna.java.net/可以自动执行或加快此过程,但不要依赖它。

除非您沿着使用OSGi或类似Tanukisoft打包工具的路径进行操作,否则无法“捆绑本机库”,Java中没有用于此目的的内置功能。<​​/ p>

使用-Djava.library.path连接点以告诉java在哪里可以找到本机库,或者使用允许您指定完整路径的System.loadLibrary的低级API。

如果您的本机库依次具有依赖项,请注意与PATH和LD_LIBRARY_PATH的交互。

答案 1 :(得分:0)

使用BridJ,您可以将DLL / .so / .dylib与JAR捆绑在一起,但您必须将它(或它们)放在JAR中特定的平台相关路径中,通过“org / bridj / lib /”并以平台+架构标识符结束。

这是BridJ自己的源代码树,展示了这种原生捆绑方案: org/bridj/lib resource directory

如果你坚持这个约定,你将不会处理PATH,LD_LIBRARY_PATH或文件提取:BridJ.register()(在@Library上调用 - 带有本机方法的带注释的类)将完成所有操作为你服务!