1. 怎麼安裝ARMtranslateARM編譯器
android x86版已經集成了arm。你可以用RE瀏覽器看一下,system\lib,銷銷下面已碰斗脊經有arm目錄了 或者試試用window系統掛載,然笑滲後把它放進去,我都用win7下載apk放進我裝的安卓系統盤。
2. x86與ARM架構下的編譯器的區別
ARM是簡單指令集。。。 指令集長度短
3. 為毛這么多軟體不能用arm編譯器怎麼裝
一般安裝了一個軟體,會包括編譯環境,編碼器,優化器等,現在都集成了很多,ARM支持C,匯編,高級的還有vc++ 比如我用的ads1.20 就有那麼多。
至於下程序到arm上,需要安裝一個軟體,我用的是HJTAG,因為我用JTAG模擬,所以我一共安裝了2個軟體。
但如果跑系統,你還得有頭文件,這個與你arm 用的操作系統有關,是代碼。
步驟肯定會有,1是你不會機器碼,在arm上就是機器碼,所以一定會有編譯器,但這些是集成的,下載軟體是燒程序的,這個和下載器配套。其他的是編寫程序相關的,初學者可以不跑系統,直接當單片機用,我至今只玩過ucos ,沒玩linux
4. 下軟體是下arm64還是x64
x64
第一、cpu配套內存訪問速度,這方面x86速度肯定更快。32位C編譯器編譯C函數時候調用使用內存棧傳遞褲磨世參數,因為內存訪問速度已經夠快,再加上cpu高速緩存,運行速度能再上一個台階。而ARM的ram是和CPU在一起的,更多考慮了功耗等問題。ram訪問速度更慢,但作為補償C程序函數的調用約定是在32位模式中用4個寄存器傳遞前4個32位參數數據,在64位模式中用8個寄存器傳遞前8個64位參數數據
第二、寄存器數量,這方面arm寄存器比x86寄存器更多,這對C程序的編譯會更友好一些
第三、關於GPU,arm晶元都是和GPU一起的,為的是減少功耗,x86要看規格和廠商,比如筆記本晶元大多帶集成GPU,而台式機可能就沒有
第四、其他類似simd指令功能使用很不一樣,相對來說arm規范很多游李,而x86的simd會更糟糕,x86的simd是16位元組對齊,而arm的simd是4位元組對齊。再比如:x86的simd整數乘法會增長數據長度,至少sse2指令集是如此的胡肢,而arm的乘法根據不同指令自己選擇。
5. 新人求教,編譯一個最簡單的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.
mole_id := MODULE.$(if \
$(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)
ifdef $(mole_id)
$(error $(LOCAL_PATH): $(mole_id) already defined by $($(mole_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/proct/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)
如此即可了。
6. ARM編譯器與VC++編譯器的區別
arm編譯器編譯出來的是arm處理器執行的二進制文件
而vc編譯出來的是在x86構架windows系統下的可執行文件
區別很大,ads編譯出來的文件是直接面對arm底層硬體的操作,很多系統函數需要自己編寫
而vc中很多類,api函數已經是現成的了,直接調用就可以了
ads中填充0xff,其實在沒有代碼的地址上填充什麼都無所謂,因為程序就不會運行到那個地址上,只是為了讓編寫程序的人清楚這個地方時空的。(個人的感覺,不知道對不對)
vc的編譯我不是很清楚,你再看看其他答案吧。也許和arm的情況差不多
7. 安卓手機上可以用的編程軟體c語言的系統有哪些
C4droidx0dx0ax0dx0aC4droid是一個C / C + + IDE + C / C + +編譯器,GNU Makefile文件,SDL和Qt支持的Android。 C4droid支持ARM處理器(而不是設備與英特爾的x86和MIPS處理器)的設備。x0dx0a您x0dx0a可以創建自己的應用程序在Android手機中,運行(即使沒有上網:編譯器為離線狀態)和出口的可執行文件(為終端的應用程序)或APK(GUI使用的x0dx0a應用程序)。此應用程序使用TCC和uClibc(GCC仿生libc的一個插件),所以它有完整的ANSI C和ISO C99支持。 x0dx0aC4droid可用於教育目的或在C和C + +語言的練習。x0dx0aC4droid支持語法高亮,代碼完成和源代碼格式,所以它是一個非常方便的工具,在旅途中進行編程。