我们需要一些专有的库来与之交互。这些库是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接口不允许直接指定路径。
答案 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
上调用 - 带有本机方法的带注释的类)将完成所有操作为你服务!