Android C/C++ 開發.

來源:互聯網
上載者:User

 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 把程式放到 虛擬機器裡。

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

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.