Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用OSGi片段以相同的文件名贡献依赖于平台的本机代码?_Java_Osgi_Native Code_Osgi Fragment - Fatal编程技术网

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

Java 如何使用OSGi片段以相同的文件名贡献依赖于平台的本机代码?,java,osgi,native-code,osgi-fragment,Java,Osgi,Native Code,Osgi Fragment,我正在使用该项目来侦听文件系统事件。这取决于每个操作系统一个本机库:处理器体系结构。例如,有一个用于Windows x86的库,一个用于x86-64等的库 整体束 最初,我有一个包,包含JNotifyJava类和本机代码。本机代码在Bundle NativeCode中声明如下: (为了更好的可读性,我将这些文件格式化为bnd样式……显然,实际的MANIFEST.MF文件格式正确) 这很有效 移动到碎片 我想,如果我将库移动到单独的片段束中,这样我就可以为我感兴趣的体系结构贡献片段,那将是一件“好

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

整体束 最初,我有一个包,包含JNotifyJava类和本机代码。本机代码在Bundle NativeCode中声明如下:

(为了更好的可读性,我将这些文件格式化为bnd样式……显然,实际的MANIFEST.MF文件格式正确)

这很有效

移动到碎片 我想,如果我将库移动到单独的片段束中,这样我就可以为我感兴趣的体系结构贡献片段,那将是一件“好事”。以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
Include-Resource: lib/libjnotify.so
Bundle-NativeCode: libjnotify.so;osname = Linux;processor = x86-64,\
    *
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,\
    *
Fragment-Host: net.contentobjects.jnotify
Bundle-Version: 0.94.0
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的版本。我想如果那条不匹配,库就被忽略了

我试过的东西
  • 正在删除可选通配符。。。这只是意味着捆绑包无法解析

检查您正在运行的Eclipse/OSGi容器的版本。我怀疑您发现您正在启动的容器的操作系统设置为32位系统

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

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

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

我还认为您需要将Bundle NativeCode头放在主机捆绑包中,并参考适当的目录,因为我认为此头未合并到主机中。

如果您不介意限制在Equinox,您可以在
Eclipse PlatformFilter中使用每个平台解决方案一个片段。在这种情况下,任何时候都只能解析和安装一个带有本机代码的片段,从而避免名称空间冲突

我假设Java7的监视服务不是一个选项。有一天!如果可以的话,我会继续讨论,但还有更多的测试,据我所知,苹果的JVM需要首先更新。我在OSGi中使用了一个版本的本机API,在没有OSGi的情况下使用了多个版本,但在OSGi中没有使用多个版本;)“os.arch=amd64”=>不,它肯定是64位的。我在32位上也看到了相反的行为,如果首先加载64位包,我也会得到一个不满意的链接错误。容器是Felix。好的,谢谢你确认这就是问题所在。有没有办法部署两个bundle,但实际上只有一个片段贡献了它们的文件?这是否可以在OBR级别完成,例如,向repository.xml文件添加某种要求,以便只在某些OSs中部署给定的片段?太好了,这似乎是可行的。我使用Include资源上的bnd分配方法将lib分配到不同的文件夹中。Bundle NativeCode似乎很好地合并到主机中。。。这是Felix顺便说一句。将Bundle NativeCode指向新位置仍然有效,我想这是因为System.loadLibrary或使用的任何东西只关心库的“基本名称”,而不关心完整路径或扩展名。