當前位置:編程學習大全網 - 源碼下載 - 新人求教,編譯壹個最簡單的Android程序,提示下面的錯誤咋解決

新人求教,編譯壹個最簡單的Android程序,提示下面的錯誤咋解決

1、32位系統下的編譯

如果需要在32位系統中編譯android系統,在編譯前需要對部分makefile進行修改

首先修改build/core/main.mk,修改的內容如下所示:

-ifneq (64,$(findstring 64,$(build_arch)))

+ifneq

(i686,$(findstring i686,$(build_arch)))

$(warning

************************************************************) $(warning You are attempting to build on a 32-bit system.)

$(warning Only 64-bit build environments are supported beyond froyo/2.2.)

其次修改如下四個文件:

external/clearsilver/cgi/Android.mk

external/clearsilver/java-jni/Android.mk

external/clearsilver/util/Android.mk

external/clearsilver/cs/Android.mk # This forces a 64-bit build for Java6

-LOCAL_CFLAGS += -m64

-LOCAL_LDFLAGS += -m64

+LOCAL_CFLAGS += -m32

+LOCAL_LDFLAGS += -m32即將LOCAL_CFLAGS和LOCAL_LDFLAGS由-m64改為-m32,從而指定使用32位系統進行編譯如果使用 64bit 的操作系統編譯,這些就都不用修改,但記得需要安裝:For 64-bit servers the following extra packages may be needed:

"sudo apt-get install libc6-dev-i386" (libc6-dev-amd64 if AMD CPU)

"sudo apt-get install g++-multilib lib32ncurses5-dev lib32z1-dev"

還有 jdk64bit 的版本編譯2 、build/core/base_rules.mk:128:*** frameworks/opt/emoji/jni:

.... libgl2jni already defined by framwworks/base/opengl/tests/gl2_jni/jni 停止

從編譯規則上看:

# Make sure that this IS_HOST/CLASS/MODULE combination is unique.

module_id := MODULE.$(if \

$(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)

ifdef $(module_id)

$(error $(LOCAL_PATH): $(module_id) already defined by $($(module_id)))

endif

在framwworks/base/opengl/tests/gl2_jni/下面定義的android.mk定義了:

LOCAL_MODULE := libgl2jni

include $(BUILD_SHARED_LIBRARY)

導致生成的動態庫重復,這是不對的,修改tests這個目錄不參與編譯即可,最直接的辦法刪除掉framwworks/base/opengl/tests/gl2_jni這個文件夾

3、AIDL 編譯報couldn't find import for class原因

“AIDL服務只支持有限的數據類型,因此,如果用AIDL服 務傳遞壹些復雜的數據就需要做更壹步處理。AIDL服務支持的數據類型如下:

Java的簡單類 型(int、char、boolean等)。不需要導入(import)。String和 CharSequence。不需要導入(import)。

List和 Map。但要註意,List和Map對象的元素類型必須是AIDL服務支持的數據類型。不需要導入(import)。AIDL自動生成 的接口。需要導入(import)。

實現 android.os.Parcelable接口的類。需要導入(import)。

其中後兩種數據類 型需要使用import進行導入,傳遞不需要 import的數據類型的值的方式相同。傳遞壹個需要import的數據類型的值(例如,實現android.os.Parcelable 接口的類)的步 驟略顯復雜。除了要建立壹個實現android.os.Parcelable接口的類外,還需要為這個類單獨建立壹個aidl文件,並使用parcelable關鍵字進行定義。”

沒有加LOCAL_AIDL_INCLUDES += xxx ,所以找不到我的parcelable aidl文件。

修改android源碼根目錄下的build/core/pathmap.mk把妳的目錄加進去,此時再make 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庫錯誤

android系統開發移植alsa-lib庫的過程中編譯的時候出現了如下的錯誤

/tmp/cckyaR40.s: Assembler messages:

/tmp/cckyaR40.s:2763: Error: selected processor does not support `mrs ip,cpsr'

/tmp/cckyaR40.s:2764: Error: unshifted register required -- `orr r2,ip,#128'

/tmp/cckyaR40.s:2765: Error: selected processor does not support `msr cpsr_c,r2

字面的意思報的是匯編錯誤,選擇的處理器不支持mrs和msr指令。

原來的ARM指令有32位和16位兩種指令模式,16位為thumb指令集,thumb指令集編譯出的代碼占用空間小,

而且效率也高,所以android的arm編譯器默認用的是thumb模式編譯,問題在於alsa的代碼中有部分的內容

用到了32位的指令,所以才會報如下的錯誤,修改的方法也很簡單,在Android.mk中加入如下內容即可:

LOCAL_ARM_MODE := arm

android的編譯系統中LOCAL_ARM_MODE變量的取值為arm或者thumb,代表32位和16位兩種arm指令集,默認為thumb

prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/../../../../arm-eabi/bin/ld: failed to set dynamic section sizes: Bad value

collect2: ld returned 1 exit status

make: *** [out/target/product/merlin/obj/SHARED_LIBRARIES/libasound_intermediates/LINKED/libasound.so] 錯誤 1

解決此問題將alsa-lib/include/config.h文件中的如下宏定義去掉即可:

#define VERSIONED_SYMBOLS

開發過程中碰到過很多錯誤,後續再壹壹總結記錄下來,有些忘記了。。

在android.mk中編譯:

include $(CLEAR_VARS)

$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

出現提示需要定義:LOCAL_MODULE_TAGS := optional 壹般修改方法是:

build\core\definitions.mk 中的宏定義變量:

define include-prebuilt

include $$(CLEAR_VARS)

LOCAL_SRC_FILES := $(1)

LOCAL_BUILT_MODULE_STEM := $(1)

LOCAL_MODULE_SUFFIX := $$(suffix $(1))

LOCAL_MODULE := $$(basename $(1))

LOCAL_MODULE_CLASS := $(2)

include $$(BUILD_PREBUILT)

endef

在這裏增加壹個LOCAL_MODULE_TAGS := optional

但是這需要修改android源碼,如果不是自已的android系統,這麽做就麻煩了,所以必須想其它辦法解決:

#include $(CLEAR_VARS)

#$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := libyfcdca.a

LOCAL_BUILT_MODULE_STEM := libyfcdca.a

LOCAL_MODULE_SUFFIX := lib

LOCAL_MODULE := yfcdca

LOCAL_MODULE_CLASS := STATIC_LIBRARIES

LOCAL_MODULE_TAGS := optional

include $(BUILD_PREBUILT)

如此即可了。供妳參考

1、32位系統下的編譯

如果需要在32位系統中編譯android系統,在編譯前需要對部分makefile進行修改

首先修改build/core/main.mk,修改的內容如下所示:

-ifneq (64,$(findstring 64,$(build_arch)))

+ifneq

(i686,$(findstring i686,$(build_arch)))

$(warning

************************************************************) $(warning You are attempting to build on a 32-bit system.)

$(warning Only 64-bit build environments are supported beyond froyo/2.2.)

其次修改如下四個文件:

external/clearsilver/cgi/Android.mk

external/clearsilver/java-jni/Android.mk

external/clearsilver/util/Android.mk

external/clearsilver/cs/Android.mk # This forces a 64-bit build for Java6

-LOCAL_CFLAGS += -m64

-LOCAL_LDFLAGS += -m64

+LOCAL_CFLAGS += -m32

+LOCAL_LDFLAGS += -m32即將LOCAL_CFLAGS和LOCAL_LDFLAGS由-m64改為-m32,從而指定使用32位系統進行編譯如果使用 64bit 的操作系統編譯,這些就都不用修改,但記得需要安裝:For 64-bit servers the following extra packages may be needed:

"sudo apt-get install libc6-dev-i386" (libc6-dev-amd64 if AMD CPU)

"sudo apt-get install g++-multilib lib32ncurses5-dev lib32z1-dev"

還有 jdk64bit 的版本編譯2 、build/core/base_rules.mk:128:*** frameworks/opt/emoji/jni:

.... libgl2jni already defined by framwworks/base/opengl/tests/gl2_jni/jni 停止

從編譯規則上看:

# Make sure that this IS_HOST/CLASS/MODULE combination is unique.

module_id := MODULE.$(if \

$(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)

ifdef $(module_id)

$(error $(LOCAL_PATH): $(module_id) already defined by $($(module_id)))

endif

在framwworks/base/opengl/tests/gl2_jni/下面定義的android.mk定義了:

LOCAL_MODULE := libgl2jni

include $(BUILD_SHARED_LIBRARY)

導致生成的動態庫重復,這是不對的,修改tests這個目錄不參與編譯即可,最直接的辦法刪除掉framwworks/base/opengl/tests/gl2_jni這個文件夾

3、AIDL 編譯報couldn't find import for class原因

“AIDL服務只支持有限的數據類型,因此,如果用AIDL服 務傳遞壹些復雜的數據就需要做更壹步處理。AIDL服務支持的數據類型如下:

Java的簡單類 型(int、char、boolean等)。不需要導入(import)。String和 CharSequence。不需要導入(import)。

List和 Map。但要註意,List和Map對象的元素類型必須是AIDL服務支持的數據類型。不需要導入(import)。AIDL自動生成 的接口。需要導入(import)。

實現 android.os.Parcelable接口的類。需要導入(import)。

其中後兩種數據類 型需要使用import進行導入,傳遞不需要 import的數據類型的值的方式相同。傳遞壹個需要import的數據類型的值(例如,實現android.os.Parcelable 接口的類)的步 驟略顯復雜。除了要建立壹個實現android.os.Parcelable接口的類外,還需要為這個類單獨建立壹個aidl文件,並使用parcelable關鍵字進行定義。”

沒有加LOCAL_AIDL_INCLUDES += xxx ,所以找不到我的parcelable aidl文件。

修改android源碼根目錄下的build/core/pathmap.mk把妳的目錄加進去,此時再make 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庫錯誤

android系統開發移植alsa-lib庫的過程中編譯的時候出現了如下的錯誤

/tmp/cckyaR40.s: Assembler messages:

/tmp/cckyaR40.s:2763: Error: selected processor does not support `mrs ip,cpsr'

/tmp/cckyaR40.s:2764: Error: unshifted register required -- `orr r2,ip,#128'

/tmp/cckyaR40.s:2765: Error: selected processor does not support `msr cpsr_c,r2

字面的意思報的是匯編錯誤,選擇的處理器不支持mrs和msr指令。

原來的ARM指令有32位和16位兩種指令模式,16位為thumb指令集,thumb指令集編譯出的代碼占用空間小,

而且效率也高,所以android的arm編譯器默認用的是thumb模式編譯,問題在於alsa的代碼中有部分的內容

用到了32位的指令,所以才會報如下的錯誤,修改的方法也很簡單,在Android.mk中加入如下內容即可:

LOCAL_ARM_MODE := arm

android的編譯系統中LOCAL_ARM_MODE變量的取值為arm或者thumb,代表32位和16位兩種arm指令集,默認為thumb

prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/../../../../arm-eabi/bin/ld: failed to set dynamic section sizes: Bad value

collect2: ld returned 1 exit status

make: *** [out/target/product/merlin/obj/SHARED_LIBRARIES/libasound_intermediates/LINKED/libasound.so] 錯誤 1

解決此問題將alsa-lib/include/config.h文件中的如下宏定義去掉即可:

#define VERSIONED_SYMBOLS

開發過程中碰到過很多錯誤,後續再壹壹總結記錄下來,有些忘記了。。

在android.mk中編譯:

include $(CLEAR_VARS)

$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

出現提示需要定義:LOCAL_MODULE_TAGS := optional 壹般修改方法是:

build\core\definitions.mk 中的宏定義變量:

define include-prebuilt

include $$(CLEAR_VARS)

LOCAL_SRC_FILES := $(1)

LOCAL_BUILT_MODULE_STEM := $(1)

LOCAL_MODULE_SUFFIX := $$(suffix $(1))

LOCAL_MODULE := $$(basename $(1))

LOCAL_MODULE_CLASS := $(2)

include $$(BUILD_PREBUILT)

endef

在這裏增加壹個LOCAL_MODULE_TAGS := optional

但是這需要修改android源碼,如果不是自已的android系統,這麽做就麻煩了,所以必須想其它辦法解決:

#include $(CLEAR_VARS)

#$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := libyfcdca.a

LOCAL_BUILT_MODULE_STEM := libyfcdca.a

LOCAL_MODULE_SUFFIX := lib

LOCAL_MODULE := yfcdca

LOCAL_MODULE_CLASS := STATIC_LIBRARIES

LOCAL_MODULE_TAGS := optional

include $(BUILD_PREBUILT)

如此即可了。

  • 上一篇:如何讓DIV水平和垂直居中
  • 下一篇:TOTHENEXT新商業峰會掘金遊戲新流量窪地穿山甲等十余家機構帶來最新行業洞察
  • copyright 2024編程學習大全網