osgi未解决的要求:osgi.native

时间:2018-05-18 11:27:49

标签: osgi jna apache-karaf

我正在尝试使用JNA从包到本机库进行调用。代码本身工作正常。作为一个容器我使用karaf,我无法改变。捆绑包处于“已安装”状态,当尝试启动它时,我收到以下错误。

Error executing command: Error executing command on bundles:
        Error starting bundle 87: Could not resolve module: de.db.fkfmip.preparation.fkfmip-preparation-v2-gpio-nsb [87]
  Unresolved requirement: Require-Capability: osgi.native; native.paths.0:List<String>="libf403.so"; native.paths.2:List<String>="libf403.so"; native.paths.1:List<String>="libf403.so"; native.paths.4:List<String>="libf403.so"; native.paths.3:List<String>="libf403.so"; native.paths.5:List<String>="libf403.so"; filter:="(|(&(osgi.native.osname~=Linux)(osgi.native.processor~=ARM))(&(osgi.native.osname~=Linux)(osgi.native.processor~=arm_le))(&(osgi.native.osname~=Linux)(osgi.native.processor~=arm_be))(&(osgi.native.osname~=Linux)(osgi.native.processor~=x86-64))(&(osgi.native.osname~=Linux)(osgi.native.processor~=x86_64))(&(osgi.native.osname~=Linux)(osgi.native.processor~=arm)))"

以下是我的karaf控制台的屏幕截图: Karaf Console

我已确保在osgi.bnd

中添加了Bundle-NativeCode标记
Bundle-NativeCode: \
    libf403.so;osname=Linux;processor=ARM,\
    libf403.so;osname=Linux;processor=arm_le,\
    libf403.so;osname=Linux;processor=arm_be,\
    libf403.so;osname=Linux;processor=x86-64,\
    libf403.so;osname=Linux;processor=x86_64,\
    libf403.so;osname=Linux;processor=arm

它匹配我的系统openSUSE 42.3。

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit

我不确定我错过了什么。我是否需要为karaf安装额外的东西才能使用osgi.native?

1 个答案:

答案 0 :(得分:1)

我在使用OSGi和JNA时遇到了许多问题。也许这会有所帮助。

我的第一个错误是没有一开始就获得所有依赖。需要以下依赖项。当我遗漏第二个错误时,我遇到了奇怪的错误。

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>4.5.1</version>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>4.5.0</version>
</dependency>

如果像我一样使用自己的本机库,则需要确保已使用32位或64位编译器对其进行编译,具体取决于将在其上运行的系统。

在代码中使用JNA非常简单。您需要创建一个与本机库的方法匹配的接口,然后按如下所示加载库。

/** Shared Library libf403.so */
private F403 f403;

    /** JNA interface for libf403.so */
private interface F403 extends Library {
    int BoardConfig();
    int SetOutput(byte channel, byte status);
    int GetGroupInputs();
}

f403 = (F403) Native.loadLibrary("f403", F403.class);
f403.BoardConfig();

如果本地库位于特定位置,则还可以指定路径。例如:

f403 = (F403) Native.loadLibrary("/usr/lib/libf403.so", F403.class);

现在进入OSGi。 当您拥有自己的库并将其放在jar中时,可以执行以下操作。 将本机库放置在源文件夹/ scr / main / resources下,并在您可以命名的文件夹中。在我的示例中是linux-x86。

然后,捆绑包描述需要一个Bundle-NativeCode标记。在该标签下,您可以定义库,操作系统和处理器的完整列表。我知道我的硬件和操作系统将永远不会改变。所以对我来说很好。

Export-Package:
Import-Package: \
    com.sun.jna*;resolution:=optional, \
    *
Bundle-NativeCode: \
    linux-x86/libf403.so;osname=Linux;processor=x86 

-dsannotations: *
-dsannotations-options: norequirements
-metatypeannotations: *

请注意,如果资源中没有库,则不需要Bundle-NativeCode标记,反之亦然。您只会得到编译错误。