4

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

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

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

如何将此路径添加到插件配置中?我是否必须从我的 Activator 类中的 BundleContext 创建一个 ClassLoader,或者是否有插件配置方法可以做到这一点?

我认为通过将 .so 的路径添加到我的包装器插件的 MANIFEST.MF 中的运行时类路径中,我做了正确的事情,但这似乎并没有这样做——我想这只是为了类路径——不是库路径。设想。

有任何想法吗?

4

2 回答 2

9

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

在依赖本机代码的插件中,我在插件的根目录下有一个名为 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/

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

这一切都在我的基于 Eclipse 3.6.2 的 RCP 应用程序中成功使用。但是,我找不到任何介绍这种方法的参考资料,所以我想知道它是否正在被淘汰,转而使用 Bundle-NativeCode 指令来支持更友好的 OSGi 方法,我发现了几个参考资料:

于 2013-01-04T03:25:38.807 回答
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
于 2013-01-04T02:13:00.910 回答