osgi未解决的需求:osgi.native

osgi未解决的需求:osgi.native,osgi,jna,apache-karaf,Osgi,Jna,Apache Karaf,我正在尝试使用JNA从一个包调用一个本机库。代码本身运行良好。作为一个容器,我使用卡拉夫,我不能改变。捆绑包处于“已安装”状态,当尝试启动它时,出现以下错误 Error executing command: Error executing command on bundles: Error starting bundle 87: Could not resolve module: de.db.fkfmip.preparation.fkfmip-preparation-v2-gpi

我正在尝试使用JNA从一个包调用一个本机库。代码本身运行良好。作为一个容器,我使用卡拉夫,我不能改变。捆绑包处于“已安装”状态,当尝试启动它时,出现以下错误

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)))"
它与我的openSUSE 42.3系统相匹配

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

我不确定我错过了什么。我需要为karaf安装一些额外的东西才能与osgi.native一起工作吗?

我在使用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>
如果本机库位于特定位置,还可以指定路径。例如:

f403 = (F403) Native.loadLibrary("/usr/lib/libf403.so", F403.class);
现在转到OSGi。 当您拥有自己的库并希望它位于jar中时,您可以执行以下操作。 将本机库放在源文件夹/scr/main/resources下,并放在您可以命名的文件夹中。在我的示例中,它是linux-x86

然后,bundle描述需要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标记,反之亦然。您只会得到编译错误。

请发布命令的输出
inspect cap osgi.native 0
,该命令将报告osgi框架检测到的操作系统名称、处理器等。@NeilBartlett该命令在我的karaf控制台中不起作用,但我还是得到了信息
org.osgi.framework.language=en org.osgi.framework.os.name=Linux org.osgi.framework.os.version=4.4.76 org.osgi.framework.processor=x86
这不是我想要的信息。嗯,Karaf不支持
inspect
命令吗?令人失望。我解决了问题。Bundle NativeCode标记不支持我最初列出的多个语句,正如我在一些示例中看到的那样。当我移除除我最初需要的那一个以外的所有东西时,它工作得很好。更改为:
Bundle NativeCode:\libf403.so;osname=Linux;processor=x86
指令不支持多个条目。看见
f403 = (F403) Native.loadLibrary("/usr/lib/libf403.so", F403.class);
Export-Package:
Import-Package: \
    com.sun.jna*;resolution:=optional, \
    *
Bundle-NativeCode: \
    linux-x86/libf403.so;osname=Linux;processor=x86 

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