10

Java ソース コードとは異なるディレクトリからネイティブ ライブラリをロードする、プラットフォームに依存しない Java ステートメントはありますか? 私はこのようなものを使用したいと思います:

public class HelloWorld {
    static {
        System.loadLibrary("../some_project/HelloWorld");
    }

    public static native void print();
}

問題は、 System.loadLibrary() がパス名引数でディレクトリ区切り文字をサポートしていないことです。また、残念ながら、 System.load() には絶対パス名が必要です。これは、上記のように相対ディレクトリを指定できないことを意味するだけでなく(これをやりたい)、引数を含める必要もあります。たとえば、前述のLinux システムの JNI ライブラリ名の「lib」および「.so」拡張子。

これに対処する標準的な方法はありますか?可能であれば、正しい JNI ライブラリ名を構築するためだけに、プラットフォームに依存する Java コードを大量に記述することは避けたいと考えています。

4

2 に答える 2

21

System.mapLibraryNameを探していると思います。これは、 ClassLoader.findLibraryの実装で通常使用されるメソッドです。例えば:

File lib = new File("../some_project/" + System.mapLibraryName("HelloWorld"));
System.load(lib.getAbsolutePath());

これはlibHelloWorld.soLinuxとHelloWorld.dllWindowsで使用されます。一部のオペレーティングシステムは複数の拡張機能をサポートしており、mapLibraryNameは設計上1つしかサポートできないことに注意してください。私が知っているのはMacOS(.dylib主にそして.jnilibレガシー用)とAIX(.a.so)です。

于 2012-05-21T22:24:28.273 に答える
0

さて、あなたが明確に説明したように、あなたは使用することはできませんloadLibrary。そして、それは去りloadます。しかし、それには絶対的な道が必要です。したがって、優先ファイルパスユーティリティ関数を使用して相対パスを絶対パスに展開し、それをに渡しますload。これは不便に思えるかもしれませんが、ライブラリの検索パスの変動に依存するよりもはるかに堅牢です。

于 2012-05-21T20:01:39.183 に答える