Cargar DLL (usando JNA) dentro de un paquete OSGi
OSGi no puede encontrar mi archivo DLL, y parece que no puedo entender por qué.
Actualmente tengo el archivo DLL (foo.dll
) en la raíz de mi paquete, también he intentado tenerlo en unlibs
directorio.
El Manifiesto para el paquete en cuestión se parece a esto:
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
Luego, en mi interfaz JNA, realizo una loadLibrary (según la documentación):
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...
}
Luego en otra clase intento usar la interfaz JNA
// ...code
int var = MyFooInterface.INSTANCE.bar();
// ...more code
He suministrado JNA a través de otro paquete (que exporta com.sun.jna y los otros paquetes importados anteriormente), pero también he intentado empaquetarlo con el paquete definido aquí (y lo he agregado al classpath en ese caso, etc.).
También he tratado de especificarBundle-NativeCode: /foo.dll
.
También de interés, estas son las propiedades relevantes de OSGi (que detuve usandogetprop
)
org.osgi.framework.os.name=WindowsXP
org.osgi.framework.processor=x86
Incluso después de todo esto (y con cada prueba que hice) siempre termino con el siguiente error (y una traza de pila no se muestra):
java.lang.UnsatisfiedLinkError: Unable to load library 'foo': The specified module could not be found.
... entonces, ¿qué me estoy perdiendo?
Editar: También debo tener en cuenta que he probado y tuve éxito el código de interfaz JNA y la DLL con la que habla como parte de un programa de prueba JUnit.
Editar 2: Agregar este código a la clase que está llamando a la biblioteca parece permitir que JNA encuentre la biblioteca (cuandoNative.loadLibrary
se llama más tarde). Parece que debería poder evitar esta llamada en base a la directiva Bundle-NativeCode en el Manifiesto. Claramente, una vez que se carga la biblioteca, Native.loadLibrary capta la instancia existente de la misma, pero prefiero no depender de esta táctica muy específica del orden.
static{
System.loadLibrary("foo");
}