Dll OSGI无法在运行时通过JNI链接到本机方法

Dll OSGI无法在运行时通过JNI链接到本机方法,dll,java-native-interface,osgi,swig,Dll,Java Native Interface,Osgi,Swig,我正在尝试使用OSGI捆绑包中DLL中的方法。DLL在OSGI中正确加载,但我仍然得到一个java未满足的链接错误,找不到本机方法 在Java中单独部署时,如果没有OSGI,DLL将被加载并完美运行 以下是我所做的: 我通过SWIG生成了一个JNI桥到C++编译的DLL。 我在调用swig时指定了包名。 我在Maven pom.xml元素中声明了dll包含,该元素生成正确的清单文件。 加载DLL库时不会出现任何错误/警告 真正让我困惑的是dll中的符号似乎找不到: java.lang.unsat

我正在尝试使用OSGI捆绑包中DLL中的方法。DLL在OSGI中正确加载,但我仍然得到一个java未满足的链接错误,找不到本机方法

在Java中单独部署时,如果没有OSGI,DLL将被加载并完美运行

以下是我所做的:

我通过SWIG生成了一个JNI桥到C++编译的DLL。 我在调用swig时指定了包名。 我在Maven pom.xml元素中声明了dll包含,该元素生成正确的清单文件。 加载DLL库时不会出现任何错误/警告 真正让我困惑的是dll中的符号似乎找不到:

java.lang.unsatifiedlinkerror:com.bmw.corona.components.sample.impl.generated.AdasDeconstructorJNI.swig\u module\u initV

问题是,当它与OSGI耦合时,我猜测OSGI的类加载器中的某个地方

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

_Java\u com\u bmw\u corona\u组件\u示例\u impl\u生成的\u AdasDeconstructorJNI\u swig\u 1模块_1init@8

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

SwigeExport void JNICALL Java\u AdasdeConstructor JNI\u swig\u 1模块\u 1initJNIEnv*jenv,jclass jcls

我必须检查清单是否包含Bundle本机指令


我做错了什么?

您可能想查阅这篇维基文章:


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

问题有两个方面。首先,找不到与VisualStudio2010的方法名mangling相同的方法。我添加了一个链接器指令:

pragma commentlinker,/EXPORT:uu Java\u com\u bmw\u corona\u components\u sample\u impl\u adasdecontorjni\u swig\u module\u init=Java\u com\u bmw\u corona\u components\u sample\u impl\u adasdecontorjni\u swig\u 1模块_1init@8


所有超过100个的bundle都需要一点时间才能启动并运行,我确实得到了java.lang.NullPointerException:在启动后的前几秒钟为null。之后,一切似乎都很顺利。nullPointerException消失了。

您可以三次确保您有一个bundle原生头。。。但不愿意让我们看到它的样子-我只有一个DLL入口点,它是JNI入口点。从那里,DLL符号与它们的Java签名一起加载到虚拟机中。wiki对于理解库加载机制非常有帮助。但是,我在Windows上工作,这意味着将查询库加载器缓存,并在那里找到dll。dll已加载,但不知何故无法访问内部符号。。。我的意思是,从dll中的抽象类到Java类中的实现的方法调用的签名被加载到VM中。但我们不要让事情复杂化,最初的入口点是JNI入口函数swig_module_init。