この 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();
}
0 件のコメント:
コメントを投稿