1

2 つの Eclipse プラグインがあります。

  • plugin-1: .jar のパッケージを他のプラグインに提供します。(C++ ライブラリの Java ラッパー) このプラグインは、[ファイル] -> [新規] -> [その他] -> [既存の JAR アーカイブからのプラグイン] をクリックして作成されました。

  • plugin-2: plugin-1 のネイティブ ライブラリ .so (Bundle-NativeCodeディレクティブは MANIFEST.MF にあります) を持ち、plugin-1 からクラスをインスタンス化します。

(実際に.soをplugin-1に入れてみましたが、.soを含むプラグインプロジェクトの外で、plugin-1 MANIFEST.MFのBundle-NativeCodeディレクティブを使用しても、ライブラリをロードできないようです。 plugin-1 を使用するすべてのプラグインに .so をバンドルする必要があると思います。)

plugin-2 からインスタンス化する plugin-2 から JUnit テストを実行しています。MyClassこれは、plugin-1 からインスタンス化MyLibraryClassします。MyClassネイティブ ライブラリを正常にロードし、ネイティブ ライブラリのロードまたはインスタンス化から例外がスローされることMyLibraryClassなくインスタンス化します。この場合、プラグインは実行していません。JUnit テストだけです。UnsatisfiedLinkErrorMyLibraryClass

(製品構成を使用して) plugin-2 を実行し、 instanceiate を実行するとMyClass、ネイティブ ライブラリは正常に読み込まれますが、UnsatisifiedLinkErrorwhen MyClassinstantiatesが発生しますMyLibraryClass。この場合、投稿で説明されているクラスを使用して取得した出力に基づいて、ライブラリがロードされていると思います。ロードされている JNI ライブラリのリストを取得するにはどうすればよいですか?

注: 私は Eclipse 3.6.1 を使用しています。

これは、私がやろうとしていることの本質を示すコード サンプルです。

import com.external_library.MyLibraryClass;


public class MyClass {


    public static void loadLibrary() {
      // Without Bundle-NativeCode in MANIFEST.MF I get 
      // "java.lang.UnsatisfiedLinkError: no mylibrary_java in java.library.path"
      System.loadLibrary("mylibrary_java"); // Loads libmylibrary_java.so. 

      // Works fine from JUnit Test
      // When I run the plugin, I get an UnsatisfiedLinkError:
      // "java.lang.UnsatisfiedLinkError: 
      // com.external_library.MyLibrary_javaJNI.new_MyLibraryClass__SWIG_3()J"
      MyLibraryClass instance = new MyLibraryClass(); 

    }
}
4

2 に答える 2

1

セットアップを複製しましたが、同じ例外が発生します。

この問題は次の方法で解決できます。

  • ネイティブ ライブラリを plugin-1 に追加します
  • Bundle-NativeCode ディレクティブを plugin-1 のマニフェストに追加します
  • plugins-1 の Activator の静的コンストラクターにライブラリーをロードします (ライブラリーを作成してプラグインに追加できます)。

その他の考えられるエラーの原因: パッケージ パス、クラス名、およびメソッド シグネチャは、ネイティブ バインディングを持つクラスでは決して変更しないでください。そうしないと、JNI は対応するネイティブを見つけることができず、UnsatisfiedLinkError が返されます。インポート ディレクティブで次のクラス名 com.external_library.MyLibraryClass を指定しましたが、エラー メッセージには別のクラス名 com.external_library.MyLibrary_javaJNI が含まれています。これらのエラーの原因を確認してください。

いくつかの追加説明: JUnit プラグイン テストとは対照的に、JUnit テストは OSGi 環境を開始しません。したがって、通常の JUnit テストを含むプレーンな Java アプリケーションが作成されます。ネイティブ ライブラリとアプリケーションが同じフォルダー (トップ レベル) に含まれている場合、ネイティブ ライブラリは Windows で自動的に検出されます。これが UNIX システムでも当てはまる場合、これが JUnit テストが成功した理由の説明になります。別のフォルダにある場合は、通常の Java アプリケーションの Java ライブラリ パスを指定する必要があります。

MrMas による編集: plugin-2 に .jar ファイルを追加して、plugin-1 に依存しないように plugin-2 を変更します。

  1. .jar ファイルを plugin-2 にコピーします。.so と同じディレクトリに配置します。
  2. Project->Properties->Libraries->Add Jar からプロジェクトに jar を追加します。
  3. plugin.xml->Runtime->ClassPath section->Add を介して jar をクラスパスに追加します。
  4. Jar からパッケージをエクスポートします (下流のプラグインで必要な場合)。
  5. plugin.xml->dependencies タブから plugin-1 の依存関係を削除します。

System.loadLibrary を使用してライブラリをロードし、プラグイン内および別のプラグインからクラスを使用できるようになりました。

Activator を追加する方法を見つけることができなかった既存の jar からプラグインとして作成されたため、plugin-1 を変更しないことにしました。代わりに、.jar を plugin-2 に追加するパスを選択しました。詳細については、Eclipse PlugIn への jar の追加を参照してください。

于 2013-04-05T17:10:33.380 に答える