当前位置: 首页 > 面试题库 >

在OSGi捆绑包中加载DLL(使用JNA)

楚苏燕
2023-03-14
问题内容

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 Test程序一部分与之交谈的DLL。

编辑2
:将此代码添加到正在调用该库的类似乎允许JNA找到该库(Native.loadLibrary以后被调用时)。看来我应该能够避免基于清单中的Bundle-
NativeCode指令进行此调用。显然,一旦加载库,Native.loadLibrary就会获取它的现有实例,但是我宁愿不要依赖于这种非常特定于订单的策略。

static{
    System.loadLibrary("foo");
}

问题答案:

问题是专门的JNA
loadLibrary调用,它不支持OSGi。当您从OSGi捆绑软件调用loadLibrary时,它将使用OSGi类加载器(支持捆绑软件)查找DLL的位置,在这种情况下,将其从捆绑软件中提取出来并通过System.loadLibrary()使其可加载。针对特定位置致电。

由于此JNA似乎(a)不了解OSGi,并且(b)多余,为什么不只使用System.loadLibrary()呢?

如果您需要同时编写两者,请在BundleActivator的bundle的start()方法中执行System.loadLibrary(),这将带入本机库(您可能想确保如果无法加载该包,在任何情况下都无法启动)。



 类似资料:
  • 我正在将我的spring-java项目转移到OSGi。 我有一些依赖项,这些依赖项在spring ebr repo或maven repo中不能作为包提供。处理它们的最佳方法是什么? null

  • 在感觉自己已经掌握了如何使用OSGi之后,我尝试向我的应用程序添加第三方依赖,特别是log4j2,该应用程序使用ApacheFelix并与maven捆绑插件捆绑。不幸的是,我似乎陷入了依赖地狱。 我尝试过使用许多maven捆绑包策略,如导入包,嵌入依赖,wrapImportPackage,Embed-Transitive,以及设置特定的版本号,仅举几例。以下是我的pom在这个插件中的样子: 我觉得

  • 我是OSGi的新手。我正在使用Apache Felix。我已经构建了一个捆绑包,并且具有依赖性。当我尝试使用启动它会给我这个错误。 org . OSGi . framework . bundle exception:无法解析lk . ucsc . research . belly runner[20](R 20.0):缺失需求[lk . ucsc . research . belly runner

  • 我试图在Felix中添加一个新的OSGI包(没有Karaf)作为ActiveMQ客户端(消息发送方)。 ActiveMQ客户端在非OSGI环境中运行良好。但当我在Felix中使用相同的代码(稍加修改)时,它会抛出以下错误: org.osgi.framework.捆绑异常:无法解决com.packtpub.felix.bookshelf-库存-impl-mock[7](R 7.3):缺少需求[com

  • 我使用EclipseIndigo使用OSGiJava框架开发了一些包。有一个主捆绑包,它依赖于其他捆绑包,并且具有要运行的主程序。如果我尝试在Eclipse中运行所有捆绑包,一切都正常工作,但是如果我将每个捆绑包保存为一个JAR,并在命令行中启动OSGi框架,当我尝试启动主捆绑包时,会出现异常<code>NoClassDefFoundError。找不到的类是依赖项。包的其余部分处于活动状态,主包刚

  • 我在Apache Felix上开发了一个OSGI捆绑包。捆绑包公开不同的API来实时管理YouTube事件。捆绑包服务将通过REST服务公开,并将由用户通过Web浏览器(chrome、safari、mozilla)使用。 我为该帐户生成凭据Google(client_secret和client_id)并将其保存在文件中,然后我的代码使用此凭据并正常工作。 我使用这个类(在youtube文档中找到)