1和32位系統下的編譯
如果需要在32位系統中編譯android系統,需要在編譯前修改壹些makefile。
首先修改build/core/main.mk,修改的內容如下:
-ifneq (64,$(findstring 64,$(build_arch)))
+ifneq
(i686,$(findstring i686,$(build_arch)))
$(警告
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)$(警告您正試圖在32位系統上構建。)
$(警告froyo/2.2之後只支持64位構建環境。)
其次,修改以下四個文檔:
外部/clearsilver/cgi/Android.mk
外部/clear silver/Java-JNI/Android . MK
外部/clearsilver/util/Android.mk
external/clear silver/cs/Android . MK #這將強制Java6使用64位版本
-LOCAL_CFLAGS += -m64
-LOCAL_LDFLAGS += -m64
+LOCAL_CFLAGS += -m32
+LOCAL_LDFLAGS += -m32也就是說,LOCAL_CFLAGS和LOCAL_LDFLAGS從-m64更改為-m32,從而指定使用32位系統進行編譯。如果您使用64位操作系統進行編譯,您不需要修改它們,但是請記住安裝它們:對於64位服務器,可能需要以下額外的軟件包:
" sudo apt-get install libc 6-dev-i386 "(如果是AMD CPU,則為libc6-dev-amd64)
" sudo apt-get install g++-multi lib lib 32 ncurses 5-dev lib 32 z 1-dev "
還有jdk64bit版本編譯2,build/core/base _ rules . MK:128:* * FrameWorks/opt/表情符號/JNI:
...libgl2jni已經由fram works/base/OpenGL/tests/gl2 _ JNI/JNI stop定義。
從編譯規則來看:
#確保此IS_HOST/CLASS/MODULE組合是唯壹的。
模塊標識:=模塊。$(如果\
$(LOCAL_IS_HOST_MODULE),HOST,TARGET)。$(LOCAL_MODULE_CLASS)。$(本地模塊)
ifdef $(模塊標識)
$(錯誤$(LOCAL_PATH): $(module_id)已經由$($(module_id))定義
endif
在fram works/base/OpenGL/tests/gl2 _ JNI/defines下定義的Android.mk:
LOCAL_MODULE := libgl2jni
包含$(BUILD_SHARED_LIBRARY)
復制生成的動態庫是錯誤的。您可以在不參與編譯的情況下修改測試目錄。最直接的方法就是刪除fram works/base/OpenGL/tests/gl2 _ JNI的文件夾。
3.為什麽AIDL編譯和報告找不到類的導入
“AIDL服務只支持有限數量的數據類型,所以如果妳使用AIDL服務來傳輸壹些復雜的數據,妳需要做進壹步的處理。AIDL服務支持以下數據類型:
Java的簡單類(int,char,boolean等。).不需要導入。字符串和字符序列。不需要導入。
列表和地圖。但是,請註意,列表和地圖對象的元素類型必須是AIDL服務支持的數據類型。不需要導入。AIDL自動生成界面。需要導入。
實現android.os.Parcelable接口的類。需要導入。
後兩種數據類型需要通過import導入,不需要導入的數據類型的值也以同樣的方式傳遞。傳遞需要導入的數據類型的值(例如,實現android.os.Parcelable接口的類)稍微復雜壹些。除了建立壹個實現android.os.parcelable接口的類之外,還需要為這個類單獨建立壹個aidl文件,使用parcelable關鍵字定義。"
LOCAL_AIDL_INCLUDES += xxx沒有添加,所以找不到我的可打包AIDL文件。
修改android源代碼根目錄下的build/core/pathmap.mk,添加妳的目錄,然後做update-api。
4.始終提示@Override錯誤方法不重寫其父類的方法。
用JDK1.6編譯沒問題。如果用JDK1.5編譯,會報告@Override方法沒有覆蓋其父類的方法。實際上,這個方法是類實現的接口中的壹個方法。
但是下面這個方法的jdk1.6是可以通過的,也就是說jdk1.6認為父類方法和實現接口方法都調用override,而jdk1.5沒有。
我也這麽認為不知道這是jdk1.5的bug,還是我認為覆蓋父類的方法和實現接口的方法不壹樣。但是從
從OO的角度來看,無論是覆蓋父類的方法還是實現接口的方法,都可以認為是override,因為它們的目的都是壹樣的,都是為了重用,都是多態的。
表情。
把jdk版本改成1.6就行了。
5.編譯alsa-lib庫時出錯
在將alsa-lib庫移植到android系統開發的編譯過程中出現了以下錯誤。
/tmp/cckyaR40.s:匯編程序消息:
/tmp/cckyaR40.s:2763:錯誤:選定的處理器不支持“mrs ip,cpsr”
/tmp/cckyaR40.s:2764:錯誤:需要未移位的寄存器-' orr R2,ip,#128 '
/tmp/cckyaR40.s:2765:錯誤:選定的處理器不支持“msr cpsr_c,r2
字面意思是組裝錯誤。所選處理器不支持mrs和msr指令。
原來的ARM指令有32位和16位兩種指令模式,16位是thumb指令集,所以thumb指令集編譯的代碼占用空間很小。
而且效率也高,所以安卓的arm編譯器默認以thumb模式編譯。問題是alsa代碼中有壹些內容。
使用32位指令,所以會報錯如下,修改的方法也很簡單。只需在Android.mk中添加以下內容:
本地_ ARM _模式:= arm
在android的編譯系統中,LOCAL_arm_MODE變量的值為ARM或thumb,分別代表32位和16位ARM指令集,默認值為thumb。
預構建/Linux-x86/tool chain/arm-eabi-4 . 4 . 0/bin/../lib/gcc/arm-eabi/4.4.0/../../../../arm-eabi/bin/ld:無法設置動態節大小:錯誤的值
集合2: ld返回1退出狀態
make:*[out/target/product/merlin/obj/shared _ libraries/liba sound _ intermediates/linked/liba sound . so]錯誤1。
要解決此問題,只需從alsa-lib/include/config.h文件中刪除以下宏定義:
#定義版本_符號
開發過程中遇到了很多錯誤,然後我壹壹總結記錄,有些忘記了。。
在android.mk中編譯:
包括美元(VARS結算)
$(調用add-pre build-files,STATIC_LIBRARIES,libyfcdca.a)
出現提示時,需要定義:LOCAL_MODULE_TAGS :=可選。壹般的修改方法是:
build\core\definitions.mk中的宏定義變量:
定義包含-預構建
包括$$(CLEAR_VARS)
LOCAL_SRC_FILES := $(1)
LOCAL _ build _ MODULE _ STEM:= $(1)
LOCAL_MODULE_SUFFIX := $$(後綴$(1))
LOCAL _ MODULE:= $ $(basename $(1))
LOCAL_MODULE_CLASS := $(2)
包含$ $(BUILD _ pre BUILD)
endef
在這裏添加壹個local _ module _ tags可選。
但這需要修改android源代碼。如果不是自己的安卓系統,那就麻煩了,壹定要想別的辦法解決:
#包含美元(CLEAR_VARS)
#$(調用add-pre build-files,STATIC_LIBRARIES,libyfcdca.a)
包括美元(VARS結算)
LOCAL_SRC_FILES := libyfcdca.a
LOCAL _ build _ MODULE _ STEM:= libyfcdca . a
本地模塊後綴:= lib
LOCAL_MODULE := yfcdca
本地模塊類:=靜態庫
本地模塊標簽:=可選
包含$(BUILD _ pre BUILD)
僅此而已。供您參考
1和32位系統下的編譯
如果需要在32位系統中編譯android系統,需要在編譯前修改壹些makefile。
首先修改build/core/main.mk,修改的內容如下:
-ifneq (64,$(findstring 64,$(build_arch)))
+ifneq
(i686,$(findstring i686,$(build_arch)))
$(警告
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)$(警告您正試圖在32位系統上構建。)
$(警告froyo/2.2之後只支持64位構建環境。)
其次,修改以下四個文檔:
外部/clearsilver/cgi/Android.mk
外部/clear silver/Java-JNI/Android . MK
外部/clearsilver/util/Android.mk
external/clear silver/cs/Android . MK #這將強制Java6使用64位版本
-LOCAL_CFLAGS += -m64
-LOCAL_LDFLAGS += -m64
+LOCAL_CFLAGS += -m32
+LOCAL_LDFLAGS += -m32也就是說,LOCAL_CFLAGS和LOCAL_LDFLAGS從-m64更改為-m32,從而指定使用32位系統進行編譯。如果您使用64位操作系統進行編譯,您不需要修改它們,但是請記住安裝它們:對於64位服務器,可能需要以下額外的軟件包:
" sudo apt-get install libc 6-dev-i386 "(如果是AMD CPU,則為libc6-dev-amd64)
" sudo apt-get install g++-multi lib lib 32 ncurses 5-dev lib 32 z 1-dev "
還有jdk64bit版本編譯2,build/core/base _ rules . MK:128:* * FrameWorks/opt/表情符號/JNI:
...libgl2jni已經由fram works/base/OpenGL/tests/gl2 _ JNI/JNI stop定義。
從編譯規則來看:
#確保此IS_HOST/CLASS/MODULE組合是唯壹的。
模塊標識:=模塊。$(如果\
$(LOCAL_IS_HOST_MODULE),HOST,TARGET)。$(LOCAL_MODULE_CLASS)。$(本地模塊)
ifdef $(模塊標識)
$(錯誤$(LOCAL_PATH): $(module_id)已經由$($(module_id))定義
endif
在fram works/base/OpenGL/tests/gl2 _ JNI/defines下定義的Android.mk:
LOCAL_MODULE := libgl2jni
包含$(BUILD_SHARED_LIBRARY)
復制生成的動態庫是錯誤的。您可以在不參與編譯的情況下修改測試目錄。最直接的方法就是刪除fram works/base/OpenGL/tests/gl2 _ JNI的文件夾。
3.為什麽AIDL編譯和報告找不到類的導入
“AIDL服務只支持有限數量的數據類型,所以如果妳使用AIDL服務來傳輸壹些復雜的數據,妳需要做進壹步的處理。AIDL服務支持以下數據類型:
Java的簡單類(int,char,boolean等。).不需要導入。字符串和字符序列。不需要導入。
列表和地圖。但是,請註意,列表和地圖對象的元素類型必須是AIDL服務支持的數據類型。不需要導入。AIDL自動生成界面。需要導入。
實現android.os.Parcelable接口的類。需要導入。
後兩種數據類型需要通過import導入,不需要導入的數據類型的值也以同樣的方式傳遞。傳遞需要導入的數據類型的值(例如,實現android.os.Parcelable接口的類)稍微復雜壹些。除了建立壹個實現android.os.parcelable接口的類,還需要為這個類單獨建立壹個aidl文件,使用parcelable關鍵字定義。"
LOCAL_AIDL_INCLUDES += xxx沒有添加,所以找不到我的可打包AIDL文件。
修改android源代碼根目錄下的build/core/pathmap.mk,添加妳的目錄,然後做update-api。
4.始終提示@Override錯誤方法不重寫其父類的方法。
用JDK1.6編譯沒問題。如果用JDK1.5編譯,會報告@Override方法沒有覆蓋其父類的方法。實際上,這個方法是類實現的接口中的壹個方法。
但是這個語言方法jdk1.6的以下是可以通過的,也就是說jdk1.6認為父類方法和實現接口方法都調用override,而jdk1.5沒有。
我也這麽認為不知道這是jdk1.5的bug,還是我認為覆蓋父類的方法和實現接口的方法不壹樣。但是從
OO的觀點,無論是重載父類的方法,還是實現接口的方法,都可以認為是重載,因為它們的目的都是壹樣的,都是為了重用,都是多態的。
表情。
把jdk版本改成1.6就行了。
5.編譯alsa-lib庫時出錯
在將alsa-lib庫移植到android系統開發的編譯過程中出現了以下錯誤。
/tmp/cckyaR40.s:匯編程序消息:
/tmp/cckyaR40.s:2763:錯誤:選定的處理器不支持“mrs ip,cpsr”
/tmp/cckyaR40.s:2764:錯誤:需要未移位的寄存器-' orr R2,ip,#128 '
/tmp/cckyaR40.s:2765:錯誤:選定的處理器不支持“msr cpsr_c,r2
字面意思是組裝錯誤。所選處理器不支持mrs和msr指令。
原來的ARM指令有32位和16位兩種指令模式,16位是thumb指令集,所以thumb指令集編譯的代碼占用空間很小。
而且效率也高,所以安卓的arm編譯器默認以thumb模式編譯。問題是alsa代碼中有壹些內容。
使用32位指令,所以會報錯如下,修改的方法也很簡單。只需在Android.mk中添加以下內容:
本地_ ARM _模式:= arm
在android的編譯系統中,LOCAL_arm_MODE變量的值為ARM或thumb,分別代表32位和16位ARM指令集,默認值為thumb。
預構建/Linux-x86/tool chain/arm-eabi-4 . 4 . 0/bin/../lib/gcc/arm-eabi/4.4.0/../../../../arm-eabi/bin/ld:無法設置動態節大小:錯誤的值
集合2: ld返回1退出狀態
make:*[out/target/product/merlin/obj/shared _ libraries/liba sound _ intermediates/linked/liba sound . so]錯誤1。
要解決此問題,只需從alsa-lib/include/config.h文件中刪除以下宏定義:
#定義版本_符號
開發過程中遇到了很多錯誤,然後我壹壹總結記錄,有些忘記了。。
在android.mk中編譯:
包括美元(VARS結算)
$(調用add-pre build-files,STATIC_LIBRARIES,libyfcdca.a)
出現提示時,需要定義:LOCAL_MODULE_TAGS :=可選。壹般的修改方法是:
build\core\definitions.mk中的宏定義變量:
定義包含-預構建
包括$$(CLEAR_VARS)
LOCAL_SRC_FILES := $(1)
LOCAL _ build _ MODULE _ STEM:= $(1)
LOCAL_MODULE_SUFFIX := $$(後綴$(1))
LOCAL _ MODULE:= $ $(basename $(1))
LOCAL_MODULE_CLASS := $(2)
包含$ $(BUILD _ pre BUILD)
endef
在這裏添加壹個local _ module _ tags可選。
但這需要修改android源代碼。如果不是自己的安卓系統,那就麻煩了,壹定要想別的辦法解決:
#包含美元(CLEAR_VARS)
#$(調用add-pre build-files,STATIC_LIBRARIES,libyfcdca.a)
包括美元(VARS結算)
LOCAL_SRC_FILES := libyfcdca.a
LOCAL _ build _ MODULE _ STEM:= libyfcdca . a
本地模塊後綴:= lib
LOCAL_MODULE := yfcdca
本地模塊類:=靜態庫
本地模塊標簽:=可選
包含$(BUILD _ pre BUILD)
僅此而已。