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

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

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

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

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

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

有任何想法吗?

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

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

 os -linux -x86 -.so -win32 -x86 -.dll -x86_64 -.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指令,我发现了几个引用:

  • Eclipse Wiki
  • Vogella博客文章
  • 博客文章

假设您的库位于文件位于/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