如何告诉Eclipse插件本机库驻留在哪个外部插件?

时间:2013-01-04 01:20:38

标签: java eclipse eclipse-plugin osgi

我有一个Eclipse插件,它是C ++库的Java包装器。我在Linux上运行,因此包装器提供.jar和.so。我从后一个现有的JAR存档创建了一个插件项目。我已经指出jar中本地库位置的.so。

我有另一个引用此包装器插件的插件。我可以从另一个成功运行包装器插件的插件中成功运行一个独立的java应用程序。使用它的类必须从包装器jar中导入java类,并且在从包装器库实例化任何内容之前,我必须调用System.loadLibrary。这意味着我已正确设置本机库位置等等。

当我尝试使用产品定义在OSGi上下文中执行相同类型的操作时,我得到一个java.lang.UnsatisfiedLinkError。如果我编辑产品定义的运行配置以添加-Djava.library.path=<full path to the .so>,我再次能够运行 - 即库正常运行。

如何将此路径添加到插件配置中?我是否必须从我的Activator类内部的BundleContext创建一个ClassLoader,或者是否有插件配置方法来执行此操作?

我认为我有正确的做法是将.so的路径添加到我的包装器插件的MANIFEST.MF中的运行时类路径但是这似乎没有 - 我想这只是针对类路径 - 不是图书馆的路径。设想。

有什么想法吗?

2 个答案:

答案 0 :(得分:8)

我在项目中做了类似的事情。

在我依赖本机代码的插件中,我在插件的根目录下有一个名为os的文件夹,其中包含以下内容:

os
-linux
 -x86
  -<libname>.so
-win32
 -x86
  -<libname>.dll
 -x86_64
  -<libname>.dll

build.properties指定(除其他外)os文件夹应作为插件构建过程的一部分打包:

bin.includes = META-INF/,\
               plugin.xml,\
               lib/,\
               os/,\
               .,\
               schema/

当使用插件的产品在其中一个提供本机库的平台下运行时,Java System.loadLibrary("libname")调用将正确解析库。

这一切都在基于Eclipse 3.6.2的RCP应用程序中成功使用。但是,我找不到任何引用这种方法的引用,所以我想知道它是否已经退役,支持更多OSGi友好的方法,使用Bundle-NativeCode指令,我发现了几个引用:

答案 1 :(得分:1)

假设您的图书馆位于文件位于/path/to/your/library/foobar.so

你试过这个吗?

cd /path/to/eclipse
export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH
./eclipse

-Djava.library.path属性不应包含foobar.so(根据LD_LIBRARY_PATH)

示例:

-Djava.library.path=/path/to/your/library             #correct
-Djava.library.path=/path/to/your/library/foobar.so   #wrong

export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH             #correct
export LD_LIBRARY_PATH=/path/to/your/library/foobar.so:$LD_LIBRARY_PATH   #wrong