通过更具体的处理器体系结构过滤器在OSGi包中加载本机代码

通过更具体的处理器体系结构过滤器在OSGi包中加载本机代码,osgi,native,Osgi,Native,在OSGi捆绑包中注册本机库时,使用bundle NativeCode头: libjnotify.so;osname = Linux;processor = x86 这使得libjnotify.so库在JavaVM在x86Linux环境中执行时可用 。然而,这并不包括新的OSs或处理器架构。此外,它还不包括仅处理器体系结构还不够的环境 作为后一种情况的一个例子,考虑ARM环境。OSGi为我们提供了ARM_le和ARM_be,但我的理解是这还不够。不同版本的ARM体系结构(ARMv6、ARMv7

在OSGi捆绑包中注册本机库时,使用
bundle NativeCode
头:

libjnotify.so;osname = Linux;processor = x86
这使得
libjnotify.so
库在JavaVM在x86Linux环境中执行时可用

。然而,这并不包括新的OSs或处理器架构。此外,它还不包括仅处理器体系结构还不够的环境

作为后一种情况的一个例子,考虑ARM环境。OSGi为我们提供了ARM_le和ARM_be,但我的理解是这还不够。不同版本的ARM体系结构(ARMv6、ARMv7等)不考虑端性,都不兼容二进制文件。此外,带有FPU的ARM架构可以运行使用“软浮点”(armel)或“硬浮点”(armhf)ABI的操作系统。为硬浮点编译的库不能在软浮点系统上运行,反之亦然


因此,在这些更复杂的环境中,如何加载本机代码?

您可以在启动Java时设置系统属性,以定义操作系统名称和处理器:

-Dorg.osgi.framework.processor=my\u processor\u name-Dorg.osgi.framework.os.name=my\u os\u name

见核心R5规范第4.5.3节

然后,您可以在Bundle NativeCode头中引用这些名称


此外,您还可以向OSGi提交新的操作系统和处理器名称,如中所述。

启动标志非常有用,谢谢。关于操作系统和处理器名称的提交,OSGi指令将运行它们的
properties.jar
并报告输出。不幸的是,在我运行Ubuntu12.04的测试系统(ARMv7、le、hf)上,该架构被简单地报告为“arm”。我认为这个问题可能比OSGi更进一步,因为
System.getProperties(“os.arch”)
返回相同的内容。这意味着您的JVM供应商没有将
os.arch
属性设置为足够描述性的值。因此,如我所述设置OSGi属性是您的解决方法。关于信息,JVM是OpenJDK 7(7u21-2.3.9-0ubuntu0.12.04.1)。当我有机会的时候,我会用OracleJava8/JavaFXHardFloatARM预览版试试。Felix中有一个bug使得它无法工作。Felix始终将org.OSGi.framework.os.name等OSGi配置属性设置为默认值。转义是创建一个过滤器。(见错误)