Jython UnsatisfiedLinkError对共享库中的本机方法调用

时间:2011-10-19 19:56:46

标签: java java-native-interface jython swig

首先,这是工作,然后我将描述什么不是:使用SWIG,我们采用了一些第三方代码,并创建了Java和C包装器源。创建了Java类的jar文件和C包装器代码的共享库。我们有一个Java代码库,可以加载共享库,并且可以根据需要调用本机代码。这是在Sun HostSpot JVM 1.5.0.14上运行的。不用担心。

现在,这是无法正常工作:使用相同的JVM,带有Java包装器代码的jar文件和上面描述的相同共享库,我试图使用Jython来做一些脚本。 CLASSPATH和LD_LIBRARY_PATH环境变量已正确设置。从Jython,我能够运行java.lang.System.loadLibrary(...),并加载共享库而不会出错。但是,当我在Jython脚本中为Java对象调用此库中的第一个本机方法时,我从JVM获得 UnsatisfiedLinkError

我在共享库上运行了nm,并且我看到有问题的方法存在于库中(如JNI规范中所述,本机方法名称为mangling)。那么,问题是,什么可以阻止JVM解析方法名称?

我已经完成了JNI规范,我发现GC可以卸载一个库。在我调用方法之前会发生这种情况吗?还有什么可能导致失败?

1 个答案:

答案 0 :(得分:0)

我以前遇到过这个问题。在我的情况下,正在加载的DLL / .so库具有未找到的进一步依赖性,并且错误消息仅报告了我试图加载的库。我使用下面的工具来找出缺少的依赖项。

如果您使用的是Windows,请使用进程监视器http://technet.microsoft.com/en-us/sysinternals/bb896645查看应用程序正在搜索的确切DLL。您需要启动Process Monitor,然后运行您的应用程序并过滤日志以查看您的应用程序正在查找哪些dll。

如果您使用的是Linux,请使用strace(http://en.wikipedia.org/wiki/Strace)并查看缺少哪个共享库。