日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Android C/C++ 开发

發布時間:2024/9/5 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android C/C++ 开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://www.linuxidc.com/Linux/2010-08/27880.htm


嚴格意義上來講,Google?Android?平臺只支持基于 Android Dalvik VM 的 Java 語言開發,當前的 Android 對C/C++開發的支持僅限于用C/C++開發動態鏈接庫,然后在Java中以JNI的形式來調用,換句話說,僅僅依靠C/C++在Android平臺上進行應用的開發,當前還無法實現。這對于廣大在Symbian和Windows Phone平臺上使用C/C++進行手機應用開發的開發者來說并不是一個好消息。對于Android本身來說,也有不利的地方,它將大量的C/C++開發主力軍擋在了Android平臺的門外,不利于Android的繁榮發展。

當然,作為一個被廣泛裝載的智能手機操作系統平臺,平臺本身對開發的多樣性的支持將是一種趨勢,類似于占市場主導地位的Symbian支持C++,Java開發。

隨著Android?NDK的推出,我們也看到了Google 對Android平臺下支持C/C++開發所進行的努力,由此,Android平臺的C/C++開發也進入了正規軍的行列,雖然還不是主力軍。盡管當前Google推出了有助于C/C++開發的NDK,但是當前版本的NDK功能上還有很多局限性:NDK并沒有提供對應用程序生命周期的維護;NDK也不提供對Android系統中大量系統事件的支持;對于作為應用程序交互接口的UI API,當前版本的NDK中也沒有提供,由此可見,NDK只是Google對Android平臺上C/C++開發的一個初步的支持,我們期待Google可以做得更多更好。

Android?平臺整體架構分為4層,分別為:

Applications:????????????????????????????????????????????????????? 應用程序層

Application Framework:?????????????????????????? 應用程序框架層

Library &&?Android?Runtime:?????????????? 底層功能庫以及Android運行時

Linux Kernel:???????????????????????????????????????????????????? Linux 內核

Android?整體架構圖如下:

Android?不支持 C/C++ 開發? 虛擬機以上的程序是 JAVA開發,但是底層可以用 C/C++ 跑一些 后臺 程序啊, 大不了用 soket 通信嘛. 計劃在 rootfs? 里存放一套自己的 busybox, 自己的 Bash, 自己的 command 等,command 完全可以做成靜態的, Android 里的 shell 實在太難用了。

用?Android.mk 的方式去編譯 C 程序也實在是太麻煩, 打算整理出一套 其他的編譯 C? 程序的方法.NDK? NDK 只是 JNI 的完善,能方便的把 so 和 java 程序打包到 apk 文件中去.很多人說只能靜態編譯C 程序, 那是胡扯,你如果用 android 里的交叉編譯工具,用它 的環境去編譯,自然可以不用靜態。

下面給出一套方法, 方便的用??Android?環境,編譯 C/C++ 程序。

后續,我還會嘗試移植各種 C 庫到?Android?中去,也會分享一些 移植的經驗和方法。

先自己做一個配置文件, 主要是??Android的編譯和 鏈接參數:

cat zconfig.mk


ifdef ANDDROID
Abionic=$(A)bionic/libc/
AoutLib=$(A)out/target/product/generic/obj/lib/
CFLAGS += -I $(A)bionic/libc/arch-arm/include -I $(A)bionic/libc/include -I $(A)bionic/libc/kernel/common -I $(A)bionic/libc/kernel/arch-arm -c -fno-exceptions -Wno-multichar -march=armv5te -mtune=xscale -msoft-float -fpic -mthumb-interwork -ffunction-sections -funwind-tables \
?-fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ \
?-include $(A)system/core/include/arch/linux-arm/AndroidConfig.h -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -DSK_RELEASE -DNDEBUG \
?-O2 -Wstrict-aliasing=2 -finline-functions -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop \
?-frename-registers -DNDEBUG -UDEBUG -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64? -MD

LIBS +=-nostdlib -Bdynamic -Wl,-T,$(A)build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc

LIBS +=-L$(AoutLib) -Wl,-rpath-link=$(AoutLib) -lc -lm? $(AoutLib)crtbegin_dynamic.o -Wl,--no-undefined $(A)/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a $(AoutLib)crtend_Android.o
endif

接下來是一個通用的 Makefile, 這個 Makefile 中需要包含 zconfig.mk

cat Makefile

ifdef TARGET
include zconfig.mk
CROSS=$(CROSS_COMPILER)-
CC=$(CROSS)gcc
AR=$(CROSS)ar
LD=$(CROSS)ld
else
CC = gcc
AR = ar
LD = ld
STRIP = strip
endif

INCLUDE+= -I../ -I./

OBJ_DIR = obj/
OBJECTS = $(OBJ_DIR)hello.o
TARGET_OUTPUT=./hello

CFLAGS +=?
all: $(TARGET_OUTPUT) $(TEST_OUTPUT) $(OBJECTS)

$(OBJ_DIR)%.o: %.c
??????? @-mkdir -p $(OBJ_DIR)
??????? $(CC) $(INCLUDE) $(CFLAGS) -c $< -o $@

$(TARGET_OUTPUT): $(OBJECTS)
??????? $(CC) $(LIBS) -o $(TARGET_OUTPUT) $(OBJECTS) $(LD_PATH) $(LIBOBJECTS)
??????? @echo "make $@ finished on `date`"
clean:
??????? @rm -f $(TARGET_OUTPUT)
??????? @rm -rf obj

然后是一個? hello.c

#include <stdio.h>

int main()
{
??????? printf("hello world \n");
??????? return 0;
}

自己的編譯環境變量:

cat setenv.sh

export PATH=$PATH:/Android/myandroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin
export CROSS_COMPILER=arm-eabi
export TARGET=1
export ANDDROID=1
export A=/Android/mydroid/

在 編譯 helloworld 以前, 請確認,你已經編譯過?Android? 源代碼,

確認 out 目錄下有相應的庫和工具。

這套機制十分靈活,你可以輕松的編譯 X86? 版, ARM LINUX 版,?Android?版。

最后執行

make

編譯成功以后, 用 adb push 把程序放到 虛擬機里。

如果要編譯動態庫,則有有點小小的差異, 接下來會介紹。

標準的做法是 把 src 放到? /Android/develop/ 目錄下去,然后建立 Android.mk 文件,

然后 make modue ...., 但是,這種方式 太麻煩。

下面介紹一種方法,可以比較快速的編譯 C 庫,

和上一篇中一樣,首先要設置自己的環境變量:

cat setenv.sh

export PATH=$PATH:/Android/myandroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin


export CROSS_COMPILER=arm-eabi
export TARGET=1
export ANDDROID=1
export A=/Android/mydroid/

然后依然是建立一個 mk 文件:

cat zconfiglib.mk


ifdef ANDDROID
Abionic=$(A)bionic/libc/
AoutLib=$(A)out/target/product/teton_ebook/obj/lib/
CFLAGS += -I $(A)bionic/libc/arch-arm/include -I $(A)bionic/libc/include -I $(A)bionic/libc/kernel/common -I $(A)bionic/libc/kernel/arch-arm -c -fno-exceptions -Wno-multichar -march=armv5te -mtune=xscale -msoft-float -fpic -mthumb-interwork -ffunction-sections -funwind-tables \
?-fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ \
?-include $(A)system/core/include/arch/linux-arm/AndroidConfig.h -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -DSK_RELEASE -DNDEBUG \
?-O2 -Wstrict-aliasing=2 -finline-functions -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop \
?-frename-registers -DNDEBUG -UDEBUG -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64? -MD

LIBS += -nostdlib -Wl,-soname, -Wl,-T,$(A)build/core/armelf.xsc -Wl,--gc-sections -Wl,-Bsymbolic -L$(AoutLib) -Wl,--whole-archive?? -Wl,--no-whole-archive -lc? -lm -Wl,--no-undefined?? $(A)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/interwork/libgcc.a

然后是你自己的 lib 的 makefile.

cat makefile


ifdef TARGET
include /zconfiglib.mk
CROSS=$(CROSS_COMPILER)-
CC=$(CROSS)gcc
AR=$(CROSS)ar
LD=$(CROSS)ld
else
CC = gcc
AR = ar
LD = ld
STRIP = strip
endif

INCLUDE+= -I../ -I./

LIBS+= -shared

OBJ_DIR = obj/
OBJECTS = $(OBJ_DIR)hello.o
TARGET_OUTPUT=./libhello

CFLAGS +=?
all: $(TARGET_OUTPUT) $(TEST_OUTPUT) $(OBJECTS)

$(OBJ_DIR)%.o: %.c
??????? @-mkdir -p $(OBJ_DIR)
??????? $(CC) $(INCLUDE) $(CFLAGS) -c $< -o $@

$(TARGET_OUTPUT): $(OBJECTS)
??????? $(CC) $(LIBS) -o $(TARGET_OUTPUT) $(OBJECTS) $(LD_PATH)?
??????? @echo "make $@ finished on `date`"
clean:
??????? @rm -f $(TARGET_OUTPUT)
??????? @rm -rf obj

然后? make 就可以了。


編譯出來的庫貌似需要放到? /system/lib 下去。




總結

以上是生活随笔為你收集整理的Android C/C++ 开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。