如何在一个标题下使用JNAerator和多个动态库?

时间:2015-04-09 05:12:34

标签: java java-native-interface shared-libraries cross-platform jnaerator

我正在使用JNAerator生成一个我可以包含在项目中的jar文件,我想支持每个操作系统的动态库并在这个jar中进行全部归档。

到目前为止,在摆弄JNAerator时,我已经能够使用如下命令包含一个动态库:

java -jar jnaerator.jar test.dll test.h [...] -mode StandaloneJar

但是,这只包test.dll,而我有多个系统的动态库(test_win32.dlltest_win64.dlllibtest_mac.dyliblibtest_linux_x86.so和{{ 1}})我希望所有人都打包并由一个罐子支持。

有没有办法用一次JNAerator运行这种“一体化”方法,还是我必须为每个平台生成一个不同的jar文件?

1 个答案:

答案 0 :(得分:9)

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

目前,每个平台的库名称都应该是lib<name>.(so|dylib)<name>.dll,尽管可以轻松修复if you ask

(注意:我是BridJ&amp; JNAerator的作者)