相关:Installing rxtx bundle in my Raspberry
how to set rxtx with OSGi Equinox?
我正在尝试在运行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代码,所以我认为这些二进制文件是正确的。
在这一点上,我对我可能做错了什么都没有想法。任何帮助将不胜感激! 谢谢你的时间。
根据要求,我发布了结果
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
答案 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上的其他人。