Osgi将不匹配bundle内的本机代码

时间:2016-01-12 20:04:51

标签: dependencies osgi unresolved-external

我正在尝试使用具有本机代码依赖性的某个Eclipse插件。这些依赖项总是无法解决,所以这个插件永远不会被OSGI加载。

MANIFEST.MF

    Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: PROS Cortex Flash Utility
    Bundle-SymbolicName: com.purduesigbots.vexflash; singleton:=true
    Bundle-Version: 1.0.0.6
    Bundle-Activator: com.purduesigbots.vexflash.Activator
    Bundle-Vendor: Purdue ACM SIG BOTS
    Require-Bundle: org.eclipse.ui,org.eclipse.core.runtime,org.eclipse.co
     re.resources,org.eclipse.ui.ide;bundle-version="3.7.0",org.eclipse.de
     bug.ui;bundle-version="3.7.0"
    Bundle-RequiredExecutionEnvironment: JavaSE-1.6
    Bundle-ActivationPolicy: lazy
    Bundle-NativeCode:
      /libs/windows/jSSC-2.6_x86_64.dll;
      osname=win32; processor=x86_64, *
    Bundle-ClassPath: .,jna.jar,platform.jar

dll的路径是包jar内的/libs/windows/jSSC-2.6_x86_64.dll。我试过很多不同的事情试图让本地人加载,但没有成功。

如何让OSGI加载本机库?我在Windows 10上运行JRE 8 64位。

编辑:

我这样修改了MANIFEST.MF以使其正常工作

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: PROS Cortex Flash Utility
Bundle-SymbolicName: com.purduesigbots.vexflash; singleton:=true
Bundle-Version: 1.0.0.6
Bundle-Activator: com.purduesigbots.vexflash.Activator
Bundle-Vendor: Purdue ACM SIG BOTS
Require-Bundle: org.eclipse.ui,org.eclipse.core.runtime,org.eclipse.co
 re.resources,org.eclipse.ui.ide;bundle-version="3.7.0",org.eclipse.de
 bug.ui;bundle-version="3.7.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
Bundle-NativeCode:
#The OS name is not in OS aliases for OSGI, so the full name must be used
  /libs/windows/jSSC-2.6_x86_64.dll;
  osname=win32; osname="Windows 10"; processor=x86_64
Bundle-ClassPath: .,jna.jar,platform.jar

1 个答案:

答案 0 :(得分:1)

在我的情况下,在将JRE从1.8.0.5更新到1.8.0.162之后,有一个RCP应用程序在DLL上停止了 UnsatisfiedLinkError 。经过一些搜索后,我发现有两个错误one in Javaone in OSGi Bundle-NativeCode中使用 win32 别名时互相取消Windows 10下的指令。在更新之前它的工作原理是,如果Java不知道Windows返回的版本,它将回退到默认值。 OSGi和matched with the win32 alias都知道这种后退。 现在更新Java意味着不再使用默认值,而是使用“Windows 10”。但是,前Luna版本的OSGi不知道Windows 10,因此与win32别名不匹配。

我使用的解决方法是相应地覆盖 org.osgi.framework.os.name 属性,这是可行的,因为该应用程序没有其他目标:

-Dorg.osgi.framework.os.name=win32

在大多数情况下,更好的解决方案是将OSGi更新到至少3.10.0。

当然,将“Windows 10”作为附加的 os.name 添加到作者的Manifest中,也可以。我决定不这样做,因为我在依赖项中有几个这样的原生二进制文件,这些文件不在我的控制之下。