Załaduj bibliotekę DLL (używając JNA) do pakietu OSGi
OSGi nie może znaleźć mojego pliku DLL i nie mogę zrozumieć dlaczego.
Obecnie mam plik DLL (foo.dll
) w katalogu głównym mojego pakietu próbowałem go także mieć wlibs
informator.
Manifest dla danego pakietu wygląda mniej więcej tak:
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
Następnie w moim interfejsie JNA wykonuję loadLibrary (zgodnie z dokumentacją):
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...
}
Następnie w innej klasie próbuję użyć interfejsu JNA
// ...code
int var = MyFooInterface.INSTANCE.bar();
// ...more code
Dostarczam JNA za pośrednictwem innego pakietu (który eksportuje com.sun.jna i inne pakiety zaimportowane powyżej), ale próbowałem także pakować go za pomocą zdefiniowanego tutaj pakietu (w tym przypadku dodałem go do ścieżki klasy itp.).
Próbowałem też określićBundle-NativeCode: /foo.dll
.
Interesujące są również odpowiednie właściwości OSGi (które wykorzystałem przy użyciugetprop
)
org.osgi.framework.os.name=WindowsXP
org.osgi.framework.processor=x86
Nawet po tym wszystkim (i przy każdej próbie, którą wykonałem) zawsze kończę się następującym błędem (i nie pokazanym śladem stosu):
java.lang.UnsatisfiedLinkError: Unable to load library 'foo': The specified module could not be found.
... więc czego mi brakuje?
Edytować: Powinienem również zauważyć, że przetestowałem i odniosłem sukces w kodzie interfejsu JNA i bibliotece DLL, z którą rozmawia w ramach programu JUnit Test.
Edytuj 2: Dodanie tego kodu do klasy, która wywołuje bibliotekę, pozwala JNA znaleźć bibliotekę (kiedyNative.loadLibrary
zostaje wywołany później). Wydaje się, że powinienem być w stanie uniknąć tego wywołania w oparciu o dyrektywę Bundle-NativeCode w Manifeście. Oczywiście po załadowaniu biblioteki Native.loadLibrary chwyta istniejącą instancję, ale wolałbym nie polegać na taktyce specyficznej dla zamówienia.
static{
System.loadLibrary("foo");
}