如何告诉Eclipse插件外部插件的本机库驻留在何处? 我有一个Eclipse插件,它是一个C++库的java包装器。我在Linux上运行,所以包装器提供了一个.jar和一个.so。我已经从后一个现有JAR归档文件创建了一个插件项目。我已经指出了jar的本机库位置中的.so

如何告诉Eclipse插件外部插件的本机库驻留在何处? 我有一个Eclipse插件,它是一个C++库的java包装器。我在Linux上运行,所以包装器提供了一个.jar和一个.so。我已经从后一个现有JAR归档文件创建了一个插件项目。我已经指出了jar的本机库位置中的.so,java,eclipse,eclipse-plugin,osgi,Java,Eclipse,Eclipse Plugin,Osgi,我有另一个插件引用这个包装器插件。我可以从另一个插件成功地运行一个独立的java应用程序,该插件成功地利用了包装器插件。使用它的类必须从包装器jar导入java类,在从包装器库实例化任何内容之前,我必须调用System.loadLibrary。这意味着我已经正确设置了本机库的位置,等等 当我尝试使用产品定义在OSGi上下文中执行相同类型的操作时,我得到一个java.lang.UnsatifiedLinkError。如果我编辑产品定义的运行配置以添加-Djava.library.path=,我就可

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

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

如何将此路径添加到插件配置?我是否必须从Activator类中的BundleContext创建类加载器,或者是否有插件配置方法来实现这一点

我认为我将路径添加到了包装器插件的MANIFEST.MF中的.so运行时类路径中,这是正确的做法,但似乎没有做到这一点——我想这只是类路径,而不是库路径。想象一下


有什么想法吗?

假设您的库位于/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\u library\u 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

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

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

os
-linux
 -x86
  -<libname>.so
-win32
 -x86
  -<libname>.dll
 -x86_64
  -<libname>.dll
当使用插件的产品在提供本机库的某个平台下运行时,Java
System.loadLibrary(“libname”)
调用将正确解析库

这一切都在我基于Eclipse3.6.2的RCP应用程序中成功地使用。但是,我找不到任何关于这种方法的参考文献,所以我想知道它是否正在被淘汰,转而使用更为OSGi友好的方法,使用Bundle NativeCode指令,我发现了一些关于:


不清楚您是否使用OSGi规范中的Bundle NativeCode头?这不需要您设置任何环境。谢谢你的回复。我已经走上了这条路。它可以工作,但不允许我设置插件,以便它可以开箱即用。bin.includes已按照您的建议设置。我还尝试将Bundle NativeCode指令添加到我的包装器插件MANIFEST.MF中。这两个都不起作用。有效的方法(这让人困惑)是(在没有Bundle指令的情况下)将-Djava.library.path=lib/添加到使用包装器的插件中!为什么?我的插件中没有lib/目录,但包装器插件中有。为什么要在使用包装器的插件中设置库路径和包装器的相对路径?然而,该解决方案满足了可移植性需求。不过,解释一下就好了。本机库的文件夹结构是否与我的布局相匹配?操作系统和体系结构标签必须匹配。我的理解是,RCP有效地将-Djava.library.path指令添加到/OS//目录中,用于运行产品的任何操作系统和架构。bin.includes指令只是确保os目录包含在已编译的插件中,它本身不会告诉RCP/OSGi任何关于它的内容。关于如何使用它,我有一个包含本机代码和一些Java代码的插件。插件A中的Java代码是访问该本机库的唯一Java代码。我原本不知道我需要根据您概述的结构设置目录,只是带有.so的目录在build.includes中。在我看来,除了您已经布置好的内容之外,您还必须添加Bundle NativeCode,以使它甚至可能工作。我尝试了你的建议,没有这个指令,也没有这个指令,但仍然没有运气。您是否使用一个插件,使用来自包含本机库的其他插件的类来执行此操作?
bin.includes = META-INF/,\
               plugin.xml,\
               lib/,\
               os/,\
               .,\
               schema/