我正在尝试使用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?
答案 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标记,反之亦然。您只会得到编译错误。