4

C++ライブラリのJavaラッパーであるEclipseプラグインがあります。私はLinuxで実行しているので、ラッパーは.jarと.soを提供します。この後者の既存のJARアーカイブからプラグインプロジェクトを作成しました。jarのネイティブライブラリの場所にある.soをポイントしました。

このラッパープラグインを参照する別のプラグインがあります。ラッパープラグインを正常に利用するこの他のプラグインからスタンドアロンJavaアプリケーションを正常に実行できます。これを使用するクラスは、ラッパーjarからjavaクラスをインポートする必要があり、ラッパーライブラリから何かをインスタンス化する前に、System.loadLibraryを呼び出す必要があります。これは、ネイティブライブラリの場所などを正しく設定したことを意味します。

同じ種類の操作を実行しようとすると、製品定義を使用してOSGiコンテキスト内で、java.lang.UnsatisfiedLinkErrorが発生します。製品定義の実行構成を編集して追加する-Djava.library.path=<full path to the .so>と、再び実行できるようになります。つまり、ライブラリは正しく機能します。

このパスをプラグイン構成に追加するにはどうすればよいですか?Activatorクラス内のBundleContextからClassLoaderを作成する必要がありますか、それともこれを行うためのプラグイン構成方法がありますか?

ラッパープラグインのMANIFEST.MFのランタイムクラスパスに.soへのパスを追加することで正しいことを考えましたが、それは実行されていないようです-クラスパス専用だと思います-ではありませんライブラリパス。想像してみろ。

何か案は?

4

2 に答える 2

9

私は自分のプロジェクトで同じようなことをしています。

ネイティブコードに依存するプラグインでは、プラグインのルートにosという名前のフォルダーがあり、次の内容が含まれています。

os
-linux
 -x86
  -<libname>.so
-win32
 -x86
  -<libname>.dll
 -x86_64
  -<libname>.dll

build.propertiesは、(とりわけ)osフォルダーをプラグインビルドプロセスの一部としてパッケージ化する必要があることを指定します。

bin.includes = META-INF/,\
               plugin.xml,\
               lib/,\
               os/,\
               .,\
               schema/

プラグインを使用する製品が、提供されたネイティブライブラリが存在するプラットフォームの1つで実行される場合、JavaSystem.loadLibrary("libname")呼び出しはライブラリを適切に解決します。

これはすべて、Eclipse3.6.2ベースのRCPアプリケーションで正常に使用されています。ただし、このアプローチを説明する参照が見つからないため、Bundle-NativeCodeディレクティブを使用して、よりOSGiに適したアプローチを採用するために廃止されているのではないかと思います。これには、次のいくつかの参照があります。

于 2013-01-04T03:25:38.807 に答える
1

ライブラリが配置されていると仮定すると、ファイルは/path/to/your/library/foobar.soにあります。

これを試しましたか?

cd /path/to/eclipse
export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH
./eclipse

プロパティには(LD_LIBRARY_PATHに従って)を-Djava.library.path含めることはできませんfoobar.so

例:

-Djava.library.path=/path/to/your/library             #correct
-Djava.library.path=/path/to/your/library/foobar.so   #wrong

export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH             #correct
export LD_LIBRARY_PATH=/path/to/your/library/foobar.so:$LD_LIBRARY_PATH   #wrong
于 2013-01-04T02:13:00.910 に答える