Вопрос о загрузке DLL (с ​​использованием JNA) внутри пакета OSGi - PullRequest
1 голос
/ 13 августа 2010

В настоящее время у меня есть файлы DLL (rfid.dll; cpl.dll; rfidtx.dll;) в корне моего комплекта. Я создаю пакет утилит для хранения jna.jar и экспортирую com.sun.jna, com.sun.jna.ptr в качестве сервисов.

Манифест для рассматриваемой пачки выглядит примерно так:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: ServiceImpl
Bundle-SymbolicName: osgi.mti.serviceImpl
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: ZTESOFT
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: osgi.mti.service,
 org.osgi.service.component;version="1.1.0",
 com.sun.jna,
 com.sun.jna.ptr
Service-Component: OSGI-INF/component.xml
Bundle-NativeCode: rfid.dll;cpl.dll;rfidtx.dll;
 osname=WindowsXP;
 processor=x86

В моем коде интерфейс JNA объявлен как:

   public interface CLibrary extends Library {

    CLibrary INSTANCE = (CLibrary) Native.loadLibrary("rfid",
            CLibrary.class);
   ............

}

Когда я работаю, отображаются некоторые сообщения об исключениях. Корневое исключение:

    java.lang.UnsatisfiedLinkError: Unable to load library 'rfid'

Итак, как я могу решить эту проблему? Я надеюсь, что кто-то может мне помочь.

1 Ответ

1 голос
/ 22 августа 2010

См. этот существующий вопрос для более подробного объяснения. JNA не поддерживает OSGi и использует собственный код для загрузки библиотек. По-видимому, вы можете предварительно загрузить нативную библиотеку (позволяя OSGi делать работу, как и должно), которая затем удовлетворит нативный хук JNA. После этого вы сможете использовать API, предоставляемые JNA, через ваш сервис. Пожалуйста, сообщите, если это работает - я очень успешно использовал «обычный» JNI с OSGi, а также кратко попытался использовать JNA, но ничего не получил из-за его собственной ловушки загрузчика.

...