我正在使用JNAerator生成可以包含在项目中的单个jar文件,并且我想支持每个操作系统的动态库并在该单个jar中构建所有文件。
到目前为止,我一直在摆弄JNAerator,可以使用如下命令来包含单个动态库:
java -jar jnaerator.jar test.dll test.h [...] -mode StandaloneJar
但是,这只打包
test.dll
,而我有多个系统的动态库(test_win32.dll
,test_win64.dll
,libtest_mac.dylib
,libtest_linux_x86.so
和libtest_linux_amd64.so
),我希望将它们全部打包并由一个jar支持。是否可以通过一次JNAerator来执行这种“多合一”方法,还是必须为每个平台生成不同的jar文件?
最佳答案
JNAerator有一个为此专门设计的-arch
选项,尽管the doc is currently terribly vague about it:
java -jar jnaerator-0.12-shaded.jar \
-arch win32 win32/test.dll \
-arch win64 win64/test.dll \
-arch darwin_universal mac/libtest.dylib \
-arch linux_x86 linux_x86/libtest.so \
-arch linux_x64 linux_amd64/libtest.so \
test.h \
-mode StandaloneJar \
-jar test.jar
这将以BridJ期望的格式捆绑库(请参阅its wiki page about embedded binaries):
unzip -l test.jar
提供: ...
0 04-09-15 22:45 lib/win32/test.dll
0 04-09-15 22:45 lib/win64/test.dll
0 04-09-15 22:45 lib/darwin_universal/libtest.dylib
0 04-09-15 22:45 lib/linux_x86/libtest.so
0 04-09-15 22:45 lib/linux_x64/libtest.so
尽管可以很容易地将其固定为if you ask,但目前每个库的库名都应该准确为
lib<name>.(so|dylib)
或<name>.dll
。(注意:我是BridJ&JNAerator的作者)