パート1
jarとしてリリースするJavaアプリケーションを開発しています。このプログラムは、JNIが呼び出すC++外部ライブラリに依存します。それらをロードするには、絶対パスでメソッドSystem.load
を使用します。これは正常に動作します。Java - 相対パスでdllをロードしてjarファイル内に隠す
しかし、私は本当にJARの中にそれらを隠したいので、それらを収集するパッケージを作成しました。これにより、相対パス、つまりパッケージパスがロードされます。このアプローチでは、DLLをリンクすることや以前のインストールプロセスに飽きることなく、任意のディレクトリでJARを実行できます。
これは、予想される例外をスロー:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library
は、どのように私はこの作業を得ることができますか?
PART 2
フォルダにDLLをコピーする方法は、私は日食の環境の下でそれを実行したときのみ動作します(後述)。エクスポートされたJARを実行して、DLLのバイナリがうまく作成されますが、JNI 1をロードしている、次の例外がスローされます。私は、これはアクセス権限の問題になることができると思い
public static void loadBinaries(){
String os = System.getProperty("os.name").toLowerCase();
if(os.indexOf("win") >= 0){
ArrayList<String> bins = new ArrayList<String>(){{
add("/nm/metadata/bin/dependence1.dll");
add("/nm/metadata/bin/dependence2.dll");
add("/nm/metadata/bin/dependence3.dll");
add("/nm/metadata/bin/dependence4.dll");
add("/nm/metadata/bin/jniBin.dll");
}};
File f = null;
for(String bin : bins){
InputStream in = FileManager.class.getResourceAsStream(bin);
byte[] buffer = new byte[1024];
int read = -1;
try {
String[] temp = bin.split("/");
f = new File(TEMP_FOLDER, temp[temp.length-1]);
FileOutputStream fos = new FileOutputStream(f);
while((read = in.read(buffer)) != -1) {
fos.write(buffer, 0, read);
}
fos.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.load(f.getAbsolutePath());
}
}
:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56) Caused by: java.lang.UnsatisfiedLinkError: C:\Users\Supertreta\Desktop\nm files\temp\jniBin.dll: Can't find dependent libraries at java.lang.ClassLoader$NativeLibrary.load(Native Method)
私はこのロードメソッドを実行しかし、それを解決する方法を知らない。どう思いますか?
なぜあなたはそれらを非表示にしたいですか? –
清潔な瓶を提供するには – supertreta