java - 将 RXTX 集成到 Raspberry Pi 上的 OSGi 包时 Unresolved 要求

标签 java raspberry-pi osgi equinox rxtx

相关:Installing rxtx bundle in my Raspberry

how to set rxtx with OSGi Equinox?

rxtx-osgi code depot

我正在尝试在运行 Raspbian (Stretch) 的 Raspberry Pi B+ 上的 OSGi 包中使用 RXTX Java (JRE 1.8) 库。

在 Windows(7、x64)上一切正常,但在 Raspbian 上启动 bundle 会抛出 Unresolved 要求:Require-Capability 错误。

gogo: BundleException: Could not resolve module: lerna.plugins.serial_interface [6] Unresolved requirement: Require-Capability: osgi.native; native.paths.8:List="nativelib/Windows/mfz-rxtx-2.2-20081207-win-x64/rxtxParallel.dll,nativelib/Windows/mfz-rxtx-2.2-20081207-win-x64/rxtxSerial.dll"; native.paths.7:List="nativelib/Windows/i368-mingw32/rxtxParallel.dll,nativelib/Windows/i368-mingw32/rxtxSerial.dll"; native.paths.0:List="nativelib/Linux/i686-unknown-linux-gnu/librxtxParallel.so,nativelib/Linux/i686-unknown-linux-gnu/librxtxSerial.so"; native.paths.2:List="nativelib/Linux/x86_64-unknown-linux-gnu/librxtxSerial.so"; native.paths.1:List="nativelib/Linux/ia64-unknown-linux-gnu/librxtxSerial.so"; native.paths.4:List="nativelib/Mac_OS_X/librxtxSerial.jnilib"; native.paths.3:List="nativelib/Linux/armv6l/librxtxParallel.so,nativelib/Linux/armv6l/librxtxSerial.so"; native.paths.6:List="nativelib/Solaris/sparc-solaris/sparc64-sun-solaris2.8/librxtxSerial-2.1-7.so,nativelib/Solaris/sparc-solaris/sparc64-sun-solaris2.8/librxtxSerial.so"; native.paths.5:List="nativelib/Solaris/sparc-solaris/sparc32-sun-solaris2.8/librxtxSerial-2.1-7.so,nativelib/Solaris/sparc-solaris/sparc32-sun-solaris2.8/librxtxSerial.so"; filter:="(|(&(osgi.native.osname~=Linux)(osgi.native.processor~=x86))(&(osgi.native.osname~=Linux)(osgi.native.processor~=ia64))(&(osgi.native.osname~=Linux)(osgi.native.processor~=x86-64))(&(osgi.native.osname~=Linux)(osgi.native.processor~=armv6l))(&(osgi.native.osname~=Mac OS X)(|(osgi.native.processor~=x86)(osgi.native.processor~=PowerPC)(osgi.native.processor~=x86-64)))(&(osgi.native.osname~=Solaris)(osgi.native.processor~=Sparc))(&(osgi.native.osname~=Solaris)(osgi.native.processor~=Sparc64))(&(osgi.native.osname~=Win32)(osgi.native.processor~=x86))(&(osgi.native.osname~=Win32)(osgi.native.processor~=x86-64)))"

我认为我将armv6l native 二进制文件包含到 bundle 中的方式有​​问题,但我一生都找不到问题出在哪里。

bundle 本身的内容并不重要,只要它使用 RXTX 即可。

完整的 MANIFEST.MF 如下:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Serial_interface
Bundle-SymbolicName: lerna.plugins.serial_interface
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: lerna.plugins.serial_interface.Activator
Bundle-Vendor: telecom_bretagne
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Import-Package: lerna.common,
 lerna.common.exceptions,
 org.osgi.framework;version="1.3.0"
Bundle-ClassPath: src/,
 .,
 bin/,
 libs/RXTXcomm.jar
Bundle-NativeCode: 
 nativelib/Linux/i686-unknown-linux-gnu/librxtxParallel.so;
 nativelib/Linux/i686-unknown-linux-gnu/librxtxSerial.so;
 osname=Linux; processor=x86,

 nativelib/Linux/ia64-unknown-linux-gnu/librxtxSerial.so;
 osname=Linux; processor=ia64,

 nativelib/Linux/x86_64-unknown-linux-gnu/librxtxSerial.so;
 osname=Linux; processor=x86-64,

 nativelib/Linux/armv6l/librxtxParallel.so;
 nativelib/Linux/armv6l/librxtxSerial.so;
 osname=Linux; processor=armv6l,

 nativelib/Mac_OS_X/librxtxSerial.jnilib;
 osname=Mac OS X; processor=x86; processor=PowerPC; processor=x86-64,


 nativelib/Solaris/sparc-solaris/sparc32-sun-solaris2.8/librxtxSerial-2.1-7.so;
 nativelib/Solaris/sparc-solaris/sparc32-sun-solaris2.8/librxtxSerial.so;
 osname=Solaris; processor=Sparc,

 nativelib/Solaris/sparc-solaris/sparc64-sun-solaris2.8/librxtxSerial-2.1-7.so;
 nativelib/Solaris/sparc-solaris/sparc64-sun-solaris2.8/librxtxSerial.so;
 osname=Solaris; processor=Sparc64,


 nativelib/Windows/i368-mingw32/rxtxParallel.dll;
 nativelib/Windows/i368-mingw32/rxtxSerial.dll;
 osname=Win32; processor=x86,

 nativelib/Windows/mfz-rxtx-2.2-20081207-win-x64/rxtxParallel.dll;
 nativelib/Windows/mfz-rxtx-2.2-20081207-win-x64/rxtxSerial.dll;
 osname=Win32; processor=x86-64
Export-Package: gnu.io,
 lerna.plugins.serial_interface

这个 MANIFEST.MF 在 Windows 上工作得很好,而且我发现至少有两个单独的源使用相同的 ARMv6 和 RXTX 条目(引用文献位于顶部)。

二进制文件完好无损地存在于 nativelibs/文件夹中:

nativelibs folder structure (我没有足够的声誉来嵌入图像,所以有一个链接)

armv6l 的二进制文件是直接从/usr/lib/jni 中提取的,即从我尝试运行该 bundle 的 Raspberry Pi 中提取的。这些二进制文件是通过 apt-get 下载的,我可以在 OSGi 包之外运行 RXTX 代码,因此我认为这些二进制文件是正确的。

此时,我已经不知道自己可能做错了什么。任何帮助将不胜感激! 感谢您抽出时间。

编辑 1

根据要求,我发布结果 检查 cap osgi.native 0 在 Gogo 外壳中。但是,我的基本环境似乎没有加载这些包。 Windows 上不需要它们,Linux/armv6l 是否需要它们?

pi@raspberrypi:~/lerna/release $ java -jar org.eclipse.osgi_3.12.50.v20170928-1321.jar -console
ss
osgi> "Framework is launched."


id      State       Bundle
0       ACTIVE      org.eclipse.osgi_3.12.50.v20170928-1321
1       ACTIVE      org.apache.felix.gogo.runtime_0.10.0.v201209301036
2       ACTIVE      org.apache.felix.gogo.command_0.10.0.v201209301215
3       ACTIVE      org.apache.felix.gogo.shell_0.10.0.v201212101605
4       ACTIVE      org.eclipse.equinox.console_1.1.300.v20170512-2111
osgi> inspect cap osgi.native 0
Invalid argument: cap
Invalid argument: osgi.native
osgi>

我想现在很明显我对 OSGi 不太熟悉......

其他信息:

配置/config.ini 文件:

osgi.bundles=org.apache.felix.gogo.runtime@start, org.apache.felix.gogo.command@start, org.apache.felix.gogo.shell@start, org.eclipse.equinox.console@start
eclipse.ignoreApp=true
osgi.noShutdown=true
osgi.console.enable.builtin=true
osgi.compatibility.bootdelegation=true

最佳答案

我已经找到解决办法了。我确实遇到了 MANIFEST.MF 文件的问题。 Neil Bartlett 的回答暗示存在与 osgi.native 相关的问题,当我深入挖掘时,我发现 this 。与RXTX无关,但有人说:

I also found the cause of the second issue. It seems as the the processor type of 'arm_le' is not recognised by the system bundle. I delved into the the Apache felix code and it looks as though it uses the result returned by 'system.getProperty("os.arch") which on the Pi is 'arm'.

我知道 OSGi 的“ARM”(已弃用)架构,就像 official reference 中那样。 。我什至尝试过。 然而,我不知道的是,该引用显然是错误的:它应该是小写,如“arm”。

现在我的 MANIFEST.MF 看起来像这样:

 nativelib/Linux/armv6l/librxtxParallel.so;
 nativelib/Linux/armv6l/librxtxSerial.so;
 osname=Linux; processor=arm,

而且它有效。 我仍然需要深入测试该库,但至少现在它正在加载。

不过,我想知道为什么“armv6l”不能与我的 Raspberry Pi B/Raspbian (Stretch) 配合使用,尽管它对其他人在 SO 上有效。

关于java - 将 RXTX 集成到 Raspberry Pi 上的 OSGi 包时 Unresolved 要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49155185/

相关文章:

java - OSGi 蓝图配置 : injecting a list of bean references

Java 8 - 初始化列表(List)

java - 如何遍历这种格式的数组?

bash - 需要帮助创建处理多个身份验证提示的 bash 脚本

Python IOError : [Errno 2] when saving captured image 错误

java - 未找到声明式服务绑定(bind)方法

java - 带有 @OSGiService 的 EJB 名称

java - 如何将网页中的小程序包含在不同的目录中?

java - Mongo-Hadoop 简单测试因 NPE 而失败

c# - UWP 应用程序中的 Async Task.Delay 开销,是否有更好的解决方案?