当前位置: 首页 > 面试题库 >

如何使用OSGi片段以相同的文件名贡献平台相关的本机代码?

窦国源
2023-03-14
问题内容

我正在使用JNotify项目来侦听文件系统事件。这取决于每个OS:处理器体系结构的一个本机库。例如,对于Windows
x86,有一个库,对于x86-64,有一个库,等等。

单片束

最初,我有一个捆绑包,其中包含JNotify Java类和本机代码。本机代码在Bundle-NativeCode中声明如下:

(我已将这些格式设置为bnd格式,以提高可读性……显然,正确形成了MANIFEST.MF文件)。

Bundle-NativeCode: jnotify_64bit.dll;osname=Win32;osname="Windows NT (unknown)";osname = WindowsXP;osname = Windows2000;osname = Windows2003;osname = WindowsVista;osname = Windows7;osname = WindowsServer2008;osname= Windows8;osname = WindowsServer2012;processor = x86-64,\
 jnotify.dll;osname=Win32;osname="Windows NT (unknown)";osname = WindowsXP;osname = Windows2000;osname = Windows2003;osname = WindowsVista;osname = Windows7;osname = WindowsServer2008;osname = Windows8;osname = WindowsServer2012;processor = x86,\
 libjnotify.so;osname = Linux;processor = x86,\
 libjnotify64.so;osname = Linux;processor = x86-64,\
 libjnotify.dylib;osname = Mac OSX;processor = x86;processor = x86-64,\
 *

这很好。

移至片段

我认为如果将库移动到单独的片段包中,这样我就可以为我感兴趣的体系结构贡献片段,那将是“不错的”。以Linux为例,我将它们分为两个包:

Linux 32位

Include-Resource: lib/libjnotify.so
Bundle-NativeCode: libjnotify.so;osname = Linux;processor = x86,\
    *
Fragment-Host: net.contentobjects.jnotify
Bundle-Version: 0.94.0

Linux 64位

Include-Resource: lib/libjnotify.so
Bundle-NativeCode: libjnotify.so;osname = Linux;processor = x86-64,\
    *
Fragment-Host: net.contentobjects.jnotify
Bundle-Version: 0.94.0

请注意,这些捆绑包是从不同的来源构建的。尽管libjnotify.so文件名相同,但是它们在不同的Eclipse项目中是不同的文件。它们必须与JNotify相同。

请注意,相同的文件名会贡献给主机捆绑包。 在这种情况下,文件名是libjnotify.so。

如果我在64位计算机上运行这些程序,并且在32位计算机 之前 加载了64位捆绑软件,则它可以工作。

但是,如果先加载32位捆绑软件,则会得到:

Couldn't initialise JNotify: java.lang.UnsatisfiedLinkError: /blah/generated/fw/bundle46/version0.0/net.contentobjects.jnotify.linux.x86-0.94.0.jar-lib/0/libjnotify.so: /blah/generated/fw/bundle46/version0.0/net.contentobjects.jnotify.linux.x86-0.94.0.jar-lib/0/libjnotify.so: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch) (JnotifyFileSystemObserver.java:53, thread platformExecutor)

显然,正在加载32位库。 但为什么? 我的Bundle-
NativeCode定义主机必须是32位Linux机器才能使用32位bundle的版本。我以为如果该子句不匹配,该库将被忽略?

我尝试过的东西

  • 删除可选的通配符…这仅意味着捆绑包无法解决

问题答案:

由于您的片段占用相同的资源名称空间,因此只能访问一个.so文件。您只能部署一个片段,也可以尝试将它们放在不同的目录中:

 Fragment 32-bit:
 Include-Resource: x32/libjnotify.so=lib/libjnotify.so

 Fragment 64-bit:
 Include-Resource: x64/libjnotify.so=lib/libjnotify.so

我还认为您需要将Bundle-NativeCode标头放在主机包中并引用正确的目录,因为我认为此标头未在主机中合并。



 类似资料:
  • 我使用的是,我需要展平包含同名字段的文档。 我创建的文档如下所示: 在那之后,我试图像下面这样压平文档: 我的主要方法是: 展平后,我得到的文档包含一个展平字段,但我必须得到两个展平字段。 如何解决此问题?

  • 我有类别片段和子类片段用于输入要查看的类别子类。我在导航图xml中有操作来打开子类片段。如果我打开任何根类别并单击其任何子类别,那么如果单击的子曲库有子曲库,那么当用户单击它的子曲库时,我应该打开子类片段。有像树一样的方案: 根类别片段: 子类别片段: 下一个子类别片段: 当我单击最后一个子类别片段,其中与前一个父片段相同的片段(相同的操作)时,我得到以下错误: 此处导航xml: 有人知道如何在N

  • 官方组件是官方提供的较为通用的组件,开发者也可以通过 Pull Request 的方式修改提交。下面介绍如何提交官方组件。 提交组件到官方组件仓库 当前 MIP 的官方组件在Github上托管,开发者可以通过提交 Pull Request 的方式来贡献优秀的组件。 步骤 1.fork 官方组件仓库 首先,浏览器进入 GitHub 中 MIP 官方组件代码仓库:https://github.com/

  • 有兴趣为 Flarum 的发展做贡献吗?竭诚欢迎,报告错误 或是 Pull Request 都没问题! 在贡献之前,请仔细阅读 行为准则。 本文档是为想要向 Flarum 贡献代码的开发者提供的,如果您只是入门,建议您阅读进阶文档中的 Getting Started 文档了解 Flarum 的工作原理。 请查看我们的规划 里程碑,了解一下需要做的事情。您可以查看「Good first issue」

  • 问题内容: 我用Java编写了AWS Lambda函数。我用来上传Lambda 的工具(Terraform)想要使用jar文件的SHA-256哈希值来跟踪是否需要上传新版本的Lambda。 问题在于,不同OS平台(Windows和Linux)上的不同JDK创建的字节码略有不同(即使使用相同的JDK“更新”版本)。这意味着,如果我在Windows上上传了一个lambda,然后在Linux上重新运行了

  • 文档更新 如果修改了组件代码,需要在组件目录的metas.yml加上changes,直接使用next作为版本号(如果已经存在该版本号,则直接添加变更条目即可)。 中括号内为变更类型,可选值 fix enhance feature change 比如: changes: next: en: - '[fix] fix *** bug #issueId' - '[fe