我正在使用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.solibtest_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的作者)

09-30 12:34