1. 程式人生 > >“undefined JNI_GetCreatedJavaVM”和“File format not recognized”錯誤原因分析

“undefined JNI_GetCreatedJavaVM”和“File format not recognized”錯誤原因分析

如果編譯時,報如下所示錯誤:
../../third-party/hadoop/lib/libhdfs.a(jni_helper.c.o): In function `getGlobalJNIEnv':
/root/hadoop-2.4.0-src/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/jni_helper.c:446: undefined reference to `JNI_GetCreatedJavaVMs'
/root/hadoop-2.4.0-src/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/jni_helper.c:505: 
undefined reference to `JNI_CreateJavaVM'
/root/hadoop-2.4.0-src/hadoop-hdfs-project/hadoop-hdfs/src/main/native/libhdfs/jni_helper.c:505: undefined reference to `JNI_CreateJavaVM'


是因為連結時,沒有加上庫檔案libjvm.so。加上libjvm.so重編譯,如果又遇到如下所示的錯誤:
../../third-party/libjvm.so: file not recognized: File format not recognized


這問題是因為libjvm.so不能被識別,libjvm.so的版本過高導致的

nm ../../third-party/libjvm.so | grep JNI_CreateJavaVM
nm: ../../third-party/libjvm.so: 不可識別的檔案格式


檢視nm的版本:
nm --version
GNU nm 2.16.91.0.5 20051219 (SUSE Linux)
Copyright 2005 Free Software Foundation, Inc.
本程式是自由軟體;您可以按照 GNU 通用公共許可證
的條款對其進行再發行。本程式沒有任何擔保。


現在換成高一點的版本試試:
./nm --version
GNU nm 2.17.50.0.6-20.el5 20061020
Copyright 2005 Free Software Foundation, Inc.

This program is free software; you may redistribute it under the terms of
the GNU General Public License.  This program has absolutely no warranty.


再次執行,一切正常,需要升級ld​了,或者降低JRE或JDK的版本試試:
./nm libjvm.so | grep JNI_CreateJavaVM
00000000006307c0 T JNI_CreateJavaVM

實際應用中,編譯雖然存在此問題,但執行時,可以使用更高版本的libjvm.so。

ld下載地址:http://ftp.gnu.org/gnu/binutils/(ld和nm均是GNU binutils的成員之一)。