2009-01-23 60 views
5

我创建了一个插件,它包括以下文件夹结构:使用捆绑,NativeCode在Linux上不起作用

  • SRC
  • 本地/所以/ libsystemcommand.so
  • META-INF/MANIFEST.MF

该清单包括命令

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: Commands Plug-in 
Bundle-SymbolicName: de.system.commands;singleton:=true 
Bundle-Version: 1.0.0 
Bundle-Activator: de.system.commands.CommandsPlugin 
Bundle-Localization: plugin 
Bundle-NativeCode: native/so/libsystemcommand.so; osname = Linux; processor = x86 
Require-Bundle: org.eclipse.core.runtime, 
org.apache.commons.logging 
Eclipse-AutoStart: true 
Export-Package: de.system.commands, 
de.system.commands.jni, 
de.system.commands.utils 
Bundle-ClassPath: . 

下的build.properties看起来像

source.. = src/ 
output.. = bin/ 
bin.includes = META-INF/,\ 
       .,\ 
       native/ 

在我Activator类的启动方法我称之为

System.loadLibrary("systemcommand"); 

在运行时库中没有找到和UnsatisfiedLinkError被抛出。

java.lang.UnsatisfiedLinkError: no libsystemcommand in java.library.path 

我是否必须在插件中设置更多属性?我是否必须在目标平台上解压一些信息?

编辑:

java.library.path=/opt/jdk/j2re1.4.2_16/lib/i386/client:/opt/jdk/j2re1.4.2_16/lib/i386:/opt/jdk/j2re1.4.2_16/../lib/i386::/opt/dsa/lib:/opt/dsa/lib 
+0

你有什么在你的java.library.path? – dsm 2009-01-23 13:24:48

回答

1

我想我找到了解决办法。

我们只生成不工作的插件并将其复制到目标平台目录。在此之后,我们将该应用程序作为日志文件启动,无论该库是否传播。

我们想念的是,到删除配置文件夹。新插件不是unzipp,并且该库不存在于配置目录中。

很抱歉,谢谢你的回答。

编辑:

的配置文件夹放置在

<installation>/eclipse/configuration/ 

至少删除一切没有文件

<installation>/eclipse/configuration/config.ini 
0

的LIB必须是在你的文件系统(未在存档文件)。 然后,你可以使用指向lib的linux环境变量LD_LIBRARY_PATH或定义属性java.library.path

+0

我期望,这个插件可以做到这一点,因为在Windows平台上,这是没有额外的库路径工作。 – 2009-01-23 13:36:39

+0

@flolo - 你错了; Eclipse框架支持从插件包(JAR文件)加载本地库。 – McDowell 2009-01-23 14:11:56

2

我不知道库是否需要指定没有lib前缀?例如,

System.loadLibrary("systemcommand"); 

因为这是如何将库传递给gcc链接线。

+0

谢谢,但这也不起作用。 – 2009-01-23 13:53:10

1

在为Linux插件片段,我用:

Bundle-NativeCode: librptlc.so; osname = linux; processor=x86 

,并在主插件使用:

if (OS.equals(Platform.OS_LINUX)) { 
    System.loadLibrary("rptlc"); 
} 

这应该一个插件内工作过。

我似乎记得在jar的子文件夹中有一些库问题,但我不确定为什么会这样。我只是坚持在插件片段的根目录中使用库,这对我很有用。

您也可以尝试获取库(不知道这很容易)的文件系统路径,并使用加载它:

libraryPath = "C:\eclipse\bundles\123\librptlc.so"; 
System.load(libraryPath);