负载共享库上的Java版本1.6 UnsatisfiedLinkError,Java 1.4工作正常吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了负载共享库上的Java版本1.6 UnsatisfiedLinkError,Java 1.4工作正常吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4558字,纯文字阅读大概需要7分钟。
内容图文
![负载共享库上的Java版本1.6 UnsatisfiedLinkError,Java 1.4工作正常吗?](/upload/InfoBanner/zyjiaocheng/674/49f8f62d35ac4d12a5dafc94c4b7ba53.jpg)
问题解决了. libjnidiagnosticsserver.so缺少链接程序lib和libfesdiagnosticsserver.so的路径. Java 1.4在查找未定义符号方面必须比Java 1.6更自由.谢谢大家的帮助.在礼节方面有什么建议可以公平地结束这项工作吗?
(免责声明:Java新手)
我编写了一个使用JNI调用C共享库的Java应用程序.它会打印Java版本并在执行时获取并打印LD_LIBRARY_PATH.
Java 1.4版-一切都很好!:
/usr/bin/java -jar "javadiagnosticsserver-test.jar"
java version=1.4.2
LD_LIBRARY_PATH = /usr/lib/fesdiagnostics
Java版本1.6-UnsatisfiedLinkError:
在libfesdiagnosticsserver.so中定义了“未定义符号” _ZN17DiagnosticsServerC1Ev. Java 1.4看到了,Java 1.6没看到吗? System.loadLibrary(“ fesdiagnosticsserver”)调用起作用. Java 1.6 loadLibrary不知道在哪里看?
/usr/java/jdk1.6.0_26/bin/java -jar "javadiagnosticsserver-test.jar"
version=1.6.0_26
class path=javadiagnosticsserver-test.jar
os.arch=i386
sun.arch.data.model=32
$HOME = /home/esutton
$LD_LIBRARY_PATH = /usr/java/jdk1.6.0_26/jre/lib/i386/client:/usr/java/jdk1.6.0_26/jre/lib/i386:/usr/java/jdk1.6.0_26/jre/../lib/i386:/usr/lib/fesdiagnostics
Dbg: Loading native lib dependencies...
Dbg: System.loadLibrary("fesdiagnostics");
Dbg: loaded fesdiagnostics
Dbg: The undefined symbol _ZN17DiagnosticsServerC1Ev is in libfesdiagnosticsserver.so
Dbg: System.loadLibrary("fesdiagnosticsserver");
Dbg: loaded fesdiagnosticsserver
Dbg: System.loadLibrary("jnidiagnosticsserver");
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/fesdiagnostics/libjnidiagnosticsserver.so: /usr/lib/fesdiagnostics/libjnidiagnosticsserver.so: undefined symbol: _ZN17DiagnosticsServerC1Ev
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1807)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1732)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at fes.JniDiagnostics.libLoad(JniDiagnostics.java:30)
at fes.JniDiagnostics.<clinit>(JniDiagnostics.java:38)
at fes.FesDiagnostics.<clinit>(FesDiagnostics.java:17)
at javadiagnosticsservertest.Main.main(Main.java:37)
两种情况下的环境相同:
LD_LIBRARY_PATH =/usr/lib/fesdiagnostics
PATH = /opt/ActivePython-2.7/bin:/usr/java/jdk1.6.0_26/bin: \
/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin: \
/sbin:/opt/qtsdk-2010.01/qt/bin:/home/esutton/bin:/sbin: \
/opt/qtsdk-2010.01/qt/bin
JAVA_HOME = /usr/java/jdk1.6.0_26
本机C共享库编译选项:
g++ -Wl,-rpath,/opt/qtsdk-2010.01/qt/lib -shared \
-Wl,-soname,libjnidiagnosticsserver.so.1 \
-o libjnidiagnosticsserver.so.1.0.0 build/Debug/GNU-Linux-x86/ \
jnifesdiagnostics.o -L/opt/qtsdk-2010.01/qt/lib -lQtGui \
-L/opt/qtsdk-2010.01/qt/lib -L/usr/X11R6/lib -lQtCore -lpthread
ln -s libjnidiagnosticsserver.so.1.0.0 libjnidiagnosticsserver.so
ln -s libjnidiagnosticsserver.so.1.0.0 libjnidiagnosticsserver.so.1
ln -s libjnidiagnosticsserver.so.1.0.0 libjnidiagnosticsserver.so.1.0
rm -f dist/libjnidiagnosticsserver.so.1.0.0
rm -f dist/libjnidiagnosticsserver.so
rm -f dist/libjnidiagnosticsserver.so.1
rm -f dist/libjnidiagnosticsserver.so.1.0
mv -f libjnidiagnosticsserver.so.1.0.0 libjnidiagnosticsserver.so \
\libjnidiagnosticsserver.so.1 libjnidiagnosticsserver.so.1.0 dist/
当它在Java 1.4下工作时,我必须首先加载jnidiagnosticsserver的依赖项.我不理解为什么.我希望LD_LIBRARY_PATH会照顾好这个:
public class JniDiagnostics {
public native void open(String configurationFile);
public native void close();
public native String query(String restfulQueryString);
private static String[] libraryDependencyList = {"fesdiagnostics", "fesdiagnosticsserver", "jnidiagnosticsserver"};
private static void libLoad(String libName) {
System.out.println("Dbg: System.loadLibrary(\"" + libName + "\");");
System.loadLibrary(libName);
System.out.println("Dbg: loaded " + libName);
}
static //static initializer code
{
System.out.println("Dbg: Loading native lib dependencies...");
for (int i = 0; i < libraryDependencyList.length; i++) {
libLoad(libraryDependencyList[i]);
}
}
}
安全问题? Java版本配置问题?
预先感谢您的指导,
-埃德
CentOS 5.2 32-bit
Netbeans 6.9.1
Java version 1.6.0_26
PS: My goal is to get my Java source to run in a Glassfish RESTful web
service. If LD_LIBRARY_PATH can be solved for a java app, I am hoping the same
solution will apply under Glassfish 3.
解决方法:
我想问题是共享库的missig依赖关系.尝试运行以下命令来解决此问题:
ldd -d -r /home/esutton/jnidiagnosticsserver/dist/libjnidiagnosticsserver.so.1.0.0
这显示缺少符号.
UnsatisfiedLinkError记录为:
Thrown if the Java Virtual Machine cannot find an appropriate
native-language definition of a method declared native.
内容总结
以上是互联网集市为您收集整理的负载共享库上的Java版本1.6 UnsatisfiedLinkError,Java 1.4工作正常吗?全部内容,希望文章能够帮你解决负载共享库上的Java版本1.6 UnsatisfiedLinkError,Java 1.4工作正常吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。