この filtering を true にすると、対象リソースをテキストファイルと見なして、文字列の置換が実行されてしまう。
dll ファイルは、バイナリで、utf-8の文字コード規則に収まらないから、false にしないとエラーになってしまう。
後は、Bundle-NativeCode に dll ファイルを resource セクションで指定したディレクトリからの相対パスで ; により列挙すればOK
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> <resource> <directory>src/main/extlib</directory> <filtering>false</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven.compiler.plugin.version}</version> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>${maven.bundle.plugin.version}</version> <extensions>true</extensions> <configuration> <instructions> <Build-Number>${buildId}</Build-Number> <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName> <Bundle-ContactAddress>${sdk.contact.address}</Bundle-ContactAddress> <Bundle-Version>${project.version}</Bundle-Version> <Bundle-NativeCode>native/myJni.dll;native/libssl-1_1-x64.dll;native/zlib1.dll</Bundle-NativeCode> <Export-Package/> <Private-Package>jp.co.foo.bar</Private-Package> </instructions> </configuration> </plugin> </plugins> </build>
java のコードで、loadLibraryを記述する
private static boolean tryLoadLibrary(String libname) { try { System.loadLibrary(libname); return true; } catch(Exception err) { err.printStackTrace(); } return false; } // Bundle-NativeCode の dll を読み込む。Platformにより拡張子が異なるため // Java のコードでは、.dll .so といった名称まで指定しなくても良い。 public static void tryLoadLibraries() { tryLoadLibrary("native/libssl-1_1-x64"); tryLoadLibrary("native/zlib1"); tryLoadLibrary("native/myJni"); } // Load JNI static { // 自動でライブラリがロードされるはずなのだが、 // この初期化が行われるより先に、JNI の関数が呼ばれる事態が // 発生する事がある。よって、クリティカルな場所から重複して // tryLoadLibraries をコールしても大丈夫なように実装している。 tryLoadLibraries(); }