我有两个 Eclipse 插件:
plugin-1:为其他插件提供 .jar 包。(用于 C++ 库的 Java 包装器)此插件是通过单击现有 JAR 档案中的文件->新建->其他->插件创建的。
plugin-2:拥有plugin-1的本地库.so(
Bundle-NativeCode
指令在MANIFEST.MF中)并从plugin-1实例化一个类
(我实际上尝试将 .so 放在 plugin-1 中,但我似乎无法加载库,即使在 plugin-1 MANIFEST.MF 中使用 Bundle-NativeCode 指令,在包含 .so 的插件项目之外,所以我想我必须将 .so 与任何使用 plugin-1 的插件捆绑在一起。)
我正在从插件 2 运行 JUnit 测试,它从插件 2 实例化,而插件 2又从插件 1MyClass
实例化。成功加载本机库并实例化,而不会从本机库的加载或从实例化中引发其他异常。在这种情况下,我没有运行插件——只是 JUnit 测试。MyLibraryClass
MyClass
MyLibraryClass
UnsatisfiedLinkError
MyLibraryClass
当我运行 plugin-2 (使用产品配置)并实例化MyClass
时,本机库加载正常,但我得到一个UnsatisifiedLinkError
when MyClass
instantiates MyLibraryClass
。在这种情况下,我相信该库是根据我使用发布如何获取已加载的 JNI 库列表中描述的类获得的输出加载的?
注意:我使用的是 Eclipse 3.6.1。
这是一个代码示例,它显示了我正在尝试做的事情的本质: package 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();
}
}