【发布时间】:2013-03-27 04:55:47
【问题描述】:
我有两个 Eclipse 插件:
plugin-1:为其他插件提供 .jar 包。 (C++ 库的 Java Wrapper)这个插件是通过点击 File->New->Other->Plug-in from Existing JAR Archives 创建的。
plugin-2:拥有plugin-1的本地库.so(
Bundle-NativeCode指令在MANIFEST.MF中)并从plugin-1实例化一个类
(我实际上尝试将 .so 放在 plugin-1 中,但我似乎无法加载库,即使在包含 .so 的插件项目之外的 plugin-1 MANIFEST.MF 中使用 Bundle-NativeCode 指令也是如此。所以,所以我想我必须将 .so 与任何使用 plugin-1 的插件捆绑在一起。)
我正在从插件 2 运行 JUnit 测试,它从插件 2 实例化 MyClass,而插件 2 又从插件 1 实例化 MyLibraryClass。 MyClass 成功加载本机库并实例化 MyLibraryClass,而不会因加载本机库或实例化 MyLibraryClass 而引发 UnsatisfiedLinkError 或其他异常。在这种情况下,我没有运行插件——只是 JUnit 测试。
当我运行 plugin-2(使用产品配置)并实例化 MyClass 时,本机库加载正常,但当 MyClass 实例化 MyLibraryClass 时,我得到一个 UnsatisifiedLinkError。在这种情况下,我相信该库是根据我使用帖子How do I get a list of JNI libraries which are loaded?中描述的类获得的输出加载的@
注意:我使用的是 Eclipse 3.6.1。
这是一个代码示例,展示了我正在尝试做的事情的本质: 包 com.mylibrary;
import com.external_library.MyLibraryClass;
public class MyClass {
public static void loadLibrary() {
// Without Bundle-NativeCode in MANIFEST.MF I get
// "java.lang.UnsatisfiedLinkError: no mylibrary_java in java.library.path"
System.loadLibrary("mylibrary_java"); // Loads libmylibrary_java.so.
// Works fine from JUnit Test
// When I run the plugin, I get an UnsatisfiedLinkError:
// "java.lang.UnsatisfiedLinkError:
// com.external_library.MyLibrary_javaJNI.new_MyLibraryClass__SWIG_3()J"
MyLibraryClass instance = new MyLibraryClass();
}
}
【问题讨论】:
-
我有点困惑。如果我的理解正确,那么您有以下依赖链 [ 2
-
也许您也可以发布一些您的 MyLibraryClass 的代码?
-
1 不依赖于 2,但是任何使用 1 的人都在 1 中调用加载库方法。我只有一个 MyLibraryClass 的 .class 文件,但让我想想我可以给出什么代码你这将是值得的。我的意思是 JUnit,而不是 JUnit 插件。
-
@Tobias Willig -- 我修改了我的提交,希望能简化它并添加一点代码 sn-p。
-
注意:我测试了这个新配置,我仍然看到同样的问题。
标签: java eclipse-plugin swig unsatisfiedlinkerror java-native-library