1

我正在尝试使用 OSGI 包中的 DLL 中的方法。DLL 在 OSGI 中正确加载,但我仍然收到 java unsatisfied link 错误,未找到本机方法!

当仅在 Java 中独立部署(无 OSGI)时,DLL 会被加载并完美运行。

这是我所做的:

  • 我通过 SWIG 为我的 C++ 编译的 DLL 生成了一个 JNI 桥。
  • 我在调用 swig 时指定了包名。
  • 我在我的 Maven pom.xml xml 元素中声明了 dll 包含,这会生成正确的清单文件。
  • DLL 库的加载没有任何错误/警告

真正让我感到困惑的是,似乎找不到 dll 中的符号:

java.lang.UnsatisfiedLinkError: com.bmw.corona.components.sample.impl.generated.AdasDeconstructorJNI.swig_module_init()V

问题是当它与 OSGI 耦合时,我猜想在 OSGI 的 ClassLoader 中的某个地方。

dll 中的方法似乎具有正确的签名:

_Java_com_bmw_corona_components_sample_impl_generated_AdasDeconstructorJNI_swig_1module_1init@8

在生成的 SWIG 文件中使用以下原型:

SWIGEXPORT void JNICALL Java_AdasDeconstructorJNI_swig_1module_1init(JNIEnv *jenv, jclass jcls)

我三重确定清单是否包含 Bundle Native 指令。

我究竟做错了什么?

4

2 回答 2

0

您可能想查阅这篇 wiki 文章:http ://wiki.osgi.org/wiki/Dependencies_In_Native_Code

从您的描述中很难分辨,但听起来您有 2 个本机库。一个带有 JNI 入口点,另一个带有真正的本机函数。上面的 wiki 文章讨论了从 JNI 本机库到其他本机库的依赖关系。

于 2013-05-17T21:43:16.393 回答
0

问题是双重的。首先,没有发现这些方法与 Visual Studio 2010 的方法名称修改有关。我添加了一个链接器指令:

#pragma comment(linker, "/EXPORT:__Java_com_bmw_corona_components_sample_impl_AdasDeconstructorJNI_swig_module_init=_Java_com_bmw_corona_components_sample_impl_AdasDeconstructorJNI_swig_1module_1init@8")

所有捆绑包(超过 100 个)启动和运行确实需要一些时间,而且我确实java.lang.NullPointerException: null在启动后的前几秒钟得到了一个。之后,一切似乎都运行良好。并且 nullPointerException 消失了..

于 2013-05-24T08:21:46.957 回答