OSGiは私のDLLファイルを見つけることができず、その理由を理解できないようです。
foo.dll
現在、バンドルのルートにDLLファイル( )がありますが、libs
ディレクトリにも入れてみました。
問題のバンドルのマニフェストは次のようになります。
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: foobundle
Bundle-SymbolicName: com.foo.bar
Bundle-Version: 1.0.0
Bundle-Vendor: me
Import-Package: com.sun.jna,
com.sun.jna.ptr,
com.sun.jna.win32
Export-Package: com.foo.bar
Bundle-NativeCode: foo.dll;
osname=WindowsXP;
processor=x86
次に、JNAインターフェイスでloadLibraryを実行します(ドキュメントに従って)。
public interface MyFooInterface extends com.sun.jna.Library{
static final MyFooInterface INSTANCE = (MyFooInterface)com.sun.jna.Native.loadLibrary("foo", MyFooInterface .class);
// specific interface defs here...
}
次に、別のクラスでJNAインターフェイスを使用しようとします
// ...code
int var = MyFooInterface.INSTANCE.bar();
// ...more code
JNAを別のバンドル(com.sun.jnaと上記でインポートした他のパッケージをエクスポートする)で提供していますが、ここで定義したバンドルでパッケージ化してみました(その場合はクラスパスに追加しました)。
も指定してみましBundle-NativeCode: /foo.dll
た。
また興味深いことに、これらは関連するOSGiプロパティです(私はこれを使用してプルアップしましたgetprop
)
org.osgi.framework.os.name=WindowsXP
org.osgi.framework.processor=x86
このすべての後でも(そして私が行ったすべての試行で)、私は常に次のエラー(およびスタックトレースは表示されていません)で終わります:
java.lang.UnsatisfiedLinkError: Unable to load library 'foo': The specified module could not be found.
...それで私は何が欠けていますか?
編集:私は、JNAインターフェイスコードと、JUnitテストプログラムの一部として通信するDLLをテストし、成功したことにも注意する必要があります。
編集2:ライブラリを呼び出しているクラスにこのコードを追加すると、JNAはライブラリを見つけることができるようです(Native.loadLibrary
後で呼び出されたとき)。マニフェストのBundle-NativeCodeディレクティブに基づいて、この呼び出しを回避できるはずです。明らかに、ライブラリがロードされると、Native.loadLibraryはその既存のインスタンスを取得しますが、この非常に順序固有の戦術に依存したくないのです。
static{
System.loadLibrary("foo");
}