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

4
我们需要与一些专有库进行接口。这些库是Windows DLL或Linux .so文件。我们得到了定义接口的头文件。由于我从未处理过本地库,所以我查看了JNAerator(http://code.google.com/p/jnaerator/)以及BridJ和JNA等相关内容。
如何简单地使用C++头文件和编译后的库来生成接口?例如,采用类似以下方式的JNA通用方法:
SomeDLL lib = (SomeDLL) Native.loadLibrary("some_dll", SomeDLL.class);

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


参见http://stackoverflow.com/questions/3720563/access-c-shared-library-from-java-jni-jna-cni-or-swig - David J. Liszewski
2个回答

2
JNI编码通常是手动编写C++代码创建本地粘合方法的过程。有一整本书来解释这个过程。
在某些情况下,http://jna.java.net/ 可以自动化或加速此过程,但不要指望它。
除非您使用OSGi或类似Tanukisoft打包工具的路径,否则无法“捆绑本地库”,Java中没有内置功能可用于此目的。
您可以使用 -Djava.library.path 连接点告诉Java要查找本地库的位置,或者使用低级API System.loadLibrary 来指定完整路径。
如果您的本地库反过来依赖其他库,请注意与PATH和LD_LIBRARY_PATH的交互。

许多人都依赖JNA进行生产使用,现在一些人甚至也依赖BridJ。它们都允许本地代码捆绑和相对无缝的代码生成,这要归功于JNAerator,完全不需要编写本地粘合剂。 - zOlive

0

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

这是BridJ自己的源代码树,展示了这种本地捆绑方案: org/bridj/lib资源目录

如果您遵循此约定,您就不必处理PATH、LD_LIBRARY_PATH或文件提取: BridJ.register()(在具有本机方法的@Library注释类上调用)将为您完成所有操作!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接