0

私は JNA と Java を使用していますが、この質問はネイティブから非ネイティブへのブリッジに影響すると思います。

lib1.dylib に依存する Java アプリケーションがあり、lib1.dylib は lib2.dylib に依存しています。

Mac の .app ファイル内にすべてを配置したいと考えています。簡単に lib1.dylib を内部に配置し、java.classpath (または NativeLibrary.addSearchPath()) を設定して、lib1.dylib の場所を JVM に伝えることができます。問題は、lib1.dylib の依存関係も指定した場所にあることを伝える方法がわからないことです。その結果、lib1 は正常にロードされますが、オペレーティング システムのライブラリ パスにないため、lib2 が見つかりません。

この問題を克服する方法を知っている人はいますか? 多数の共有ライブラリを使用する大規模なプロジェクトでは、それがたくさん出てくるに違いないと思います。

4

2 に答える 2

2

私は以前にこの問題に遭遇しましたが、今日また問題に遭遇しました。VM引数「-Djava.library.path=/ path / to / other / libs」を追加することで回避できる場合がありますが、Javaはそれを使用して最初のライブラリを検索し、次に依存関係を探すためのシステムPATH。

私が以前に試したいくつかの解決策:

1)ライブラリをロードする前に、依存ライブラリでSystem.load(absolutePath)を使用します。ただし、そのライブラリがどこにあるかを常に知っている場合を除いて、プログラムをウルトラポータブルにするわけではありません。

2)lib1がlib2に依存している場合、依存するlibにリンクする前に、ネイティブコードでSetCurrentDirectory(Windows、Macに相当するものは不明)を実際に使用しましたが、これは機能しているようです。繰り返しますが、他のライブラリがどこにあるかを知る必要があります。

3)Windowsでは、依存ライブラリをc:\ windows \ system32にダンプすると、それらが検出されます。

同様のトピックに関するいくつかの役立つ投稿(Windows固有ですが、問題は同じだと思います):

http://www.realityinteractive.com/rgrzywinski/archives/000219.html http://www.velocityreviews.com/forums/t387618-jni-library-path.html

于 2010-03-24T22:48:43.897 に答える
0

Stewの(2)のアイデアに基づいて、MacOSXのソリューションを見つけました。

MacのJarBundler(または同じ名前のAntタスク)を使用して、workingdirectory変数を$ JAVAROOTに設定し、dylibが.appのContents / Resources/Java部分にあることを確認します。これを行うと、ダイナミックリンカは現在のディレクトリになるため、すべての依存関係dylibを検出します。Javaは、同じ理由で元のdylib(すべての依存関係を持つもの)も検出します。

Antコード:

<target name="package_mac_app" depends="package_jar, compile_native" description="bundle the runnable jar into a Mac Application -- requires JarBundler ANT Task">
    <taskdef name="jarbundler" classname="net.sourceforge.jarbundler.JarBundler"/>
    <echo message="CREATING MAC .app EXECUTABLE"/>
    <jarbundler dir="${dist}"
      name="${appname}"
      mainclass="myPackage.myMainClass"
      icon="${icon_location}"
      jvmversion="1.5+"
      infostring="${appname}"
      shortname="${appshortname}"
      bundleid="${com.mycompany.mydepartment.myprogram}"
      jar="${run_jar_location}"
      workingdirectory="$JAVAROOT">
      <javafilelist dir="${dylib_location}" files="my-lib.dylib"/>
      <javafilelist dir="${dylib_location}" files="dependent-lib.dylib"/>
    </jarbundler>

</target>
于 2010-03-25T18:52:01.060 に答える