我有一个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中的运行时类路径但是这似乎没有 - 我想这只是针对类路径 - 不是图书馆的路径。设想。
有什么想法吗?
答案 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