Linux x86 編譯 Android 遭遇 gnu/stubs-64.h
這兩天心血來潮,執(zhí)行完 repo sync 后,順手來了一下 make,不料卻發(fā)現(xiàn)了以下的錯誤:
host C: libclearsilver-jni <= external/clearsilver/java-jni/j_neo_util.c
In file included from /usr/include/features.h:378,
from /usr/include/string.h:26,
from external/clearsilver/java-jni/j_neo_util.c:1:
/usr/include/gnu/stubs.h:9:27: error: gnu/stubs-64.h: No such file or directory
make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libclearsilver-jni_intermediates/j_neo_util.o] Error 1
兵來將擋,水來土掩,用關(guān)鍵字 android “error: gnu/stubs-64.h: no such file or directory” 來搜一下吧,發(fā)現(xiàn)搜索結(jié)果寥寥無幾,看樣子問題比較新,其中有一個 CSDN 的鏈接,就順手點了過去。帖子反映的問題和我一模一樣,不過它的分析給了我一些提醒。
從錯誤信息入手,追蹤到/usr/include/gnu/stubs.h,看到如下代碼:
#if __WORDSIZE == 32
# include <gnu/stubs-32.h>
#elif __WORDSIZE == 64
# include <gnu/stubs-64.h>
#else
# error "unexpected value for __WORDSIZE macro"
#endif
順著 WORDSIZE,進(jìn)入/usr/include/bits/wordsize,發(fā)現(xiàn):
#if defined __x86_64__
# define __WORDSIZE 64
# define __WORDSIZE_COMPAT32 1
#else
# define __WORDSIZE 32
#endif
結(jié)合報錯的信息,可以知道這里一定是有定義__x86_64__,執(zhí)行一下 uname -a 可以確認(rèn) OS 明明是x86,為什么會__x86_64__呢?追根溯源, Android 源碼或許能露出蛛絲馬跡。
果不其然,從 android.git.kernel.org 的 platform/external/clearsilver.git 上,看到5天前,有個 Ying Wang 的家伙提交一個修改:Fix 64-bit clearsilver shared library issue,參看這里,修改內(nèi)容中 java-jni/Android.mk,和出現(xiàn)本次問題的路徑 java-jni/j_neo_util.c,同屬一個父目錄,看樣子有點關(guān)系,查看 Android.mk 的修改內(nèi)容,發(fā)現(xiàn)做了如下修改:
+# This forces a 64-bit build for Java6
+ifneq ($(filter 1.6%,$(java_version)),)
+ LOCAL_CFLAGS += -m64
+ LOCAL_LDFLAGS += -m64
+endif
當(dāng)發(fā)現(xiàn)你使用Java6時,它將強制使用64-bit,我想這就能解釋__x86_64__出現(xiàn)的原因。那么既然它要64-bit,我就滿足它。首先要解決 gnu/stubs-64.h: No such file or directory,解決這個問題需要執(zhí)行以下命令:
[xuhj@eniac mydroid]$ apt-get install libc6-dev-amd64
完成以后再執(zhí)行 make,發(fā)現(xiàn)有錯誤:
/usr/bin/ld: cannot find -lstdc++
那就繼續(xù)滿足它:
[xuhj@eniac mydroid]$ apt-get install g++-multilib lib64stdc++6
還是不行,又發(fā)生下面的錯誤:
/usr/bin/ld: cannot find -lz
再來執(zhí)行命令:
[xuhj@eniac mydroid]$ apt-get install lib64z1-dev
照此方法后出現(xiàn)
Could not load ‘clearsilver-jni’
不知是否因為“libclearsilver-jni.so”為64bit,在32bit系統(tǒng)無法加載?
最后把java,javac默認(rèn)改為1.5通過了編譯。
如果還是有錯,需要執(zhí)行如下命令:
make clean
make update-api (經(jīng)測試,這個可以不需要)
make
/usr/bin/ld: cannot find -lncurses
這個問題是因為沒有安裝
ncurses-devel包
sudo apt-get install libncurses5-dev
error: X11/Xlib.h No such file or directory
you need to install the packages "libx11-dev" and "libglpk0-dev".
修改Java當(dāng)前版本的命令:
sudo update-alternatives –
–config java
---------------------------------------------------------
專注移動開發(fā)
Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
posted on 2010-09-19 12:24
TiGERTiAN 閱讀(1803)
評論(0) 編輯 收藏 所屬分類:
Android