关于在OSGi包中加载DLL(使用JNA)的问题

时间:2010-08-13 01:58:27

标签: java osgi jna

目前我在我的捆绑包的根目录下有DLL文件(rfid.dll; cpl.dll; rfidtx.dll;)。 我创建了一个Utility Bundle来保存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 个答案:

答案 0 :(得分:1)

有关详细说明,请参阅this现有问题。 JNA不支持OSGi,它本身使用本机代码来加载库。显然你可以预加载本机库(让OSGi做它应该的工作),这将满足JNA的本机钩子。然后,您应该能够通过您的服务使用暴露于JNA的API。请报告这是否有效 - 我已经非常成功地将“常规”JNI与OSGi一起使用,并且还试图使用JNA,但由于它自己的加载程序钩子而无处可去。