在Raspberry Pi上将RXTX集成到OSGi包时未解决的要求

时间:2018-03-07 15:10:02

标签: 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(Seven,x64)上一切正常,但是在Raspbian上启动捆绑包会抛出未解决的要求:Require-Capability 错误。

  

gogo:BundleException:无法解析模块:lerna.plugins.serial_interface [6]     未解决的要求:要求能力:osgi.native; native.paths.8:列表= “nativelib /窗/ MFZ-RXTX-2.2-20081207赢-64 / rxtxParallel.dll,nativelib /窗/ MFZ-RXTX-2.2-20081207赢-64 / rxtxSerial.dll”; native.paths.7:列表= “nativelib /窗/ i368-mingw32的/ rxtxParallel.dll,nativelib /窗/ i368-mingw32的/ rxtxSerial.dll”; native.paths.0:列表= “nativelib / Linux的/ i686的未知-Linux的GNU / librxtxParallel.so,nativelib / Linux的/ i686的未知-Linux的GNU / librxtxSerial.so”; native.paths.2:列表= “nativelib / Linux的/ x86_64的未知-Linux的GNU / librxtxSerial.so”; native.paths.1:列表= “nativelib / Linux的/ IA64的未知-Linux的GNU / librxtxSerial.so”; native.paths.4:列表= “nativelib / Mac_OS_X / librxtxSerial.jnilib”; native.paths.3:列表= “nativelib / Linux的/ armv6l / librxtxParallel.so,nativelib / Linux的/ armv6l / librxtxSerial.so”; native.paths.6:列表=“nativelib /的Solaris / Solaris SPARC的/ SPARC64朝阳solaris2.8 / librxtxSerial-2.1-7.so,nativelib /的Solaris / Solaris SPARC的/ SPARC64朝阳solaris2.8 / librxtxSerial 。所以”; native.paths.5:列表=“nativelib /的Solaris / Solaris SPARC的/不再获得朝阳solaris2.8 / librxtxSerial-2.1-7.so,nativelib /的Solaris / Solaris SPARC的/不再获得朝阳solaris2.8 / librxtxSerial 。所以”;滤波器:=“(|(及(osgi.native.osname〜= Linux)的(osgi.native.processor〜= 86))(及(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〜= 86))(及(osgi.native.osname〜=的Win32)(osgi.native.processor〜x86的= 64)))“

我认为我将armv6l原生二进制文件包含在捆绑包中的方式有​​问题,但对于我的生活,我无法找到问题所在。

只要它使用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中直接拉出来的,我正试图运行捆绑包的Raspberry Pi。这些二进制文件是通过apt-get下载的,我可以在OSGi包之外运行RXTX代码,所以我认为这些二进制文件是正确的。

在这一点上,我对我可能做错了什么都没有想法。任何帮助将不胜感激! 谢谢你的时间。

编辑1

根据要求,我发布了结果 inspect cap osgi.native 0 在Gogo shell中。但是,我的基本环境似乎没有加载这些捆绑包。它们在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并不熟悉......

其他信息:

configuration / 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

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。我确实是MANIFEST.MF文件的一个问题。 Neil Bartlett的回答暗示有一个与osgi.native有关的问题,当我深入挖掘时,我发现this。它与RXTX无关,但有人说:

  

我也找到了第二个问题的原因。似乎系统包无法识别'arm_le'的处理器类型。我深入研究了Apache felix代码,看起来好像它使用了'system.getProperty(“os.arch”)返回的结果,它在Pi上是'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上的其他人。