2

Java クラスをロードしようとする C++ コードを呼び出しています。

JNIEnv *jenv = ...
jclass cls = jenv->FindClass("org/some/bundle/SomeClass");

さて、問題は、このクラスが OSGi バンドルに存在し、上記のコードが私のクラスを見つけられないことです。

この問題は、単体テスト (Tycho-surefire ヘッドレス テスト) を実行する場合にのみ発生します。OSGi フレームワークに強制的に JNI からクラスを検索させる簡単な方法はありますか? Java側では、次のようなDynamic-ImportPackageことが問題を解決できたのではないかと思います。テスト フレームワークで動作させるためだけにサード パーティの C++ ライブラリを変更したくないので、可能であれば、Java テストのセットアップ / 構成側でのソリューションを好みます。

4

2 に答える 2

5

JNIEnv の FindClass メソッドは、グローバル アプリケーション クラスパスによって定義されたシステム ClassLoader のコンテンツのみを検索します。OSGi はグローバル クラスパスを使用しないため、これが機能しないことは驚くことではありません。

一般に、クラスをロードするときは常に、クラス名だけでなく、それをロードするクラスローダーも指定する必要があります。これは、モジュール性の必然的な要件です。そのため、コードは、クラスを含むと予想されるバンドルを見つけて、その loadClass メソッドを呼び出すことができる必要があります。これは C++ コードで直接実行できますが、Java ユーティリティ メソッドを記述して実行し、そのメソッドを C++ から呼び出す方が簡単な場合があります。

于 2013-06-07T09:10:16.427 に答える