2012-02-21 44 views
3

问题解决。 libjnidiagnosticsserver.so缺少链接器lib和libfesdiagnosticsserver.so的路径。查找未定义符号的Java 1.4必须比Java 1.6更加宽松。感谢大家的帮助。任何关于礼仪的建议是否公平地结束?Java版本1.6加载共享库的UnsatisfiedLinkError,Java 1.4正常工作?

(免责声明: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

的 “未定义的符号_ZN17DiagnosticsServerC1Evlibfesdiagnosticsserver定义。所以。 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版本配置问题?

预先感谢任何方向,

-Ed

CentOS 5.2 32-bit 
Netbeans 6.9.1 
Java version 1.6.0_26 

PS:我的目标是让我的Java源在Glassfish的RESTful网络服务 运行。如果LD_LIBRARY_PATH可以解决的Java应用程序,我希望同 解决方案将Glassfish的3

+0

你可以尝试启动VM'的java -Djava.library.path =/usr/lib目录/ fesdiagnostics ...' – stacker 2012-02-21 16:45:58

+0

感谢堆快速回复。添加java.library。路径似乎没有影响:/usr/java/jdk1.6.0_26/bin/java -Djava.library.path =/usr/lib/fesdiagnostics -jar“javadiagnosticsserver-test.jar” – 2012-02-21 16:47:56

+0

@Ed。:你正在编译有任何选项的C++库? – Cratylus 2012-02-21 16:51:21

回答

4

下申请我想这个问题是你的共享库的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. 
+0

谢谢,但在Java版本1.4下运行良好,但在Java版本1.6下运行良好,因此不存在缺失的依赖关系。 – 2012-02-21 17:04:21

+0

运行ldd ./libjnidiagnosticsserver.so并运行ldd /usr/lib/fesdiagnostics/libfesdiagnostics.so会导致“未找到”消息为零。 – 2012-02-21 17:11:35

+0

请添加-d开关以获取更多详细信息。 – phlogratos 2012-02-21 17:13:15