http://xxw8393.blog.163.com/blog/static/37256834200910235723590/
Android NDK 已有 1.6,安装容易(解压便可),但使用上比较复杂,要与SDK的一起使用。NDK允许开发人员用C/C++语言编译部分的应用程序代码。
Windows android-ndk-1.6_r1-windows.zip
Mac OS X (intel) android-ndk-1.6_r1-darwin-x86.zip
Linux 32/64-bit (x86) android-ndk-1.6_r1-linux-x86.zip
增加 stlport, 可编译C/C++程序的代码为独立运行的 Android 应用程序
linux 方法
复制代码
- cd ~/Android
- git clone git://umbel.mooo.com/ndk-wrappers.git
- export HOST=linux-x86
- export NDK_DIR=~/Android/android-ndk-1.6_r1
- export NDK_WRAPPERS_BASE=~/Android/ndk-wrappers
- export PATH=~/Android/ndk-wrappers/bin:$PATH
- 修改 ndk-wrappers/scripts/env-utils.sh
- SYSROOT="${NDK_DIR}/build/platforms/android-4/arch-arm"
- HOST=linux-x86
- 修改 ndk-wrappers/stlport/build/lib/android.mak
- --sysroot=$(NDK_DIR)/build/platforms/android-1.5/arch-arm /
- 為
- --sysroot=$(NDK_DIR)/build/platforms/android-4/arch-arm /
- cd ~/Android/ndk-wrappers
- ./env.sh
- ./setup.sh
|
mac 方法
复制代码
- cd ~/Android
- git clone git://umbel.mooo.com/ndk-wrappers.git
- 修改 ndk-wrappers/setup.sh
- export HOST=darwin-x86
- export NDK_DIR=~/Android/android-ndk-1.6_r1
- export NDK_WRAPPERS_BASE=~/Android/ndk-wrappers
- 修改 ndk-wrappers/scripts/build-stlport.sh
- export NDK_WRAPPERS_BASE=~/Android/ndk-wrappers
- export PATH=~/Android/ndk-wrappers/bin:$PATH
- 修改 ndk-wrappers/scripts/env-utils.sh
- SYSROOT="${NDK_DIR}/build/platforms/android-4/arch-arm"
- HOST=darwin-x86
- 修改 ndk-wrappers/stlport/build/lib/android.mak
- --sysroot=$(NDK_DIR)/build/platforms/android-1.5/arch-arm /
- 為
- --sysroot=$(NDK_DIR)/build/platforms/android-4/arch-arm /
- 增加链接
- cd ~/Android/ndk-wrappers/stlport/build/Makefiles/gmake
- ln -s linux arm-linux
|
安装 stlport
复制代码
- cd ~/Android/ndk-wrappers
- ./setup.sh
|
测试 qsort.cpp
复制代码
- #include <iostream>
- #include <stdlib.h>
- using namespace std;
- int sortFunction( const void *intOne, const void *intTwo);
- const int length = 10;
- int main(void)
- {
- int i,intArray[length];
- for (i = 0; i < length; i++)
- {
- cout << "Enter a number [" << i << "]: ";
- cin >> intArray[i];
- }
- cout << "/n";
- qsort((void *)intArray, length, sizeof(intArray[0]), sortFunction);
- for (i = 0; i < length; i++)
- cout << "intArray [" << i << "]: " << intArray[i] << endl;
- cout << "Done." << endl;
- return 0;
- }
- int sortFunction( const void *a, const void *b)
- {
- int intOne = *((int*)a);
- int intTwo = *((int*)b);
- if (intOne < intTwo)
- return -1;
- if (intOne == intTwo)
- return 0;
- return 1;
- }
|
编译及测试
复制代码
- ~/Android/ndk-wrappers/bin/arm-linux-g++ -o qsort qsort.cpp -L~/Android/ndk-wrappers/stlport/build/lib/obj/arm-linux-gcc/so
- ~/Android/android-sdk-mac_x86-1.6_r1/tools/adb push qsort /data/local/bin/qsort
- ~//Android/android-sdk-mac_x86-1.6_r1/tools/adb shell chmod 755 /data/local/bin/qsort
- ~/Android/android-sdk-mac_x86-1.6_r1/tools/adb shell
- 进入shell 后
- /data/local/bin/qsort
|
android gcc toolchain
pocketmagic 有一篇关于编译 android gcc toolchain 的方法可编译C/C++程序的代码为
独立运行的 Android 应用程序
http://www.pocketmagic.net/?p=682
现附上已编译好的mac (androidgcc_mac.tgz) 及 linux (androidgcc_linux.tgz) 版本
使用方法如下
(1) 下载后解压
复制代码
- mkdir -p ~/Android/androidgcc
- cd ~/Android/androidgcc
- tar -xzvf ~/Downloads/androidgcc_mac.tgz
|
或
复制代码
- mkdir -p ~/Android/androidgcc
- cd ~/Android/androidgcc
- tar -xzvf ~/Documents/androidgcc_linux.tgz
|
(2) 下载agcc 脚本至 ~/Android/Projects/
http://www.pocketmagic.net/wp-content/uploads/2009/05/agcc
可用 mac / linux Terminal
复制代码
- cd ~/Android/Projects/
- curl -O http://www.pocketmagic.net/wp-content/uploads/2009/05/agcc
|
(3) agcc 安装方法
mac 用 Terminal 安装方法
复制代码
- cd ~/Android/Projects/
- sed "s/linux-x86/darwin-x86/g;" "s/arm-eabi-4.3.1/arm-eabi-4.2.1/g;" agcc > agcc.mac
- cp agcc.mac agcc
- chmod +x agcc
|
linux 用 Terminal 安装方法
复制代码
- cd ~/Android/Projects/
- chmod +x agcc
|
(4) 修改环境变量
mac
复制代码
- export PATH=~/Android/androidgcc/prebuilt/darwin-x86/toolchain/arm-eabi-4.2.1/bin:${PATH}
- 或
- vi ~/.bash_profile
- 為
- PATH=~/Android/androidgcc/prebuilt/darwin-x86/toolchain/arm-eabi-4.2.1/bin:~/Android/android-sdk-mac_x86-1.6_r1/tools:"${PATH}"
|
linux
复制代码
- export PATH=~/Android/androidgcc/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin:${PATH}
- 或
- vi ~/.bash_profile
- 為
- PATH=~/Android/androidgcc/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin:~/Android/android-sdk-linux_x86-1.6_r1/tools:"${PATH}"
|
(5) 测试 Hello, Android World!
必须先将手机上的USB调试(Debug)模式打开及手机连接到 USB
复制代码
- cd ~/Android/Projects/
- echo 'main() { printf("Hello, Android World!/n");}' > main.c
- ./agcc main.c -o main
- adb push main /data/local/bin/main
- adb shell chmod 775 /data/local/bin/main
- adb shell /data/local/bin/main
|
(6) 用 Makefile
复制代码
- AGCC=~/Android/androidgcc
- #mac
- SDKTOOL=~/Android/android-sdk-mac_x86-1.6_r1/tools
- #linux
- #SDKTOOL=~/Android/android-sdk-linux_x86-1.6_r1/tools
- APP=hello
- #mac
- CC=$(AGCC)/prebuilt/darwin-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc
- CPP=$(AGCC)/prebuilt/darwin-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-g++
- #linux
- #CC=$(AGCC)/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc
- #CPP=$(AGCC)/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-g++
- LD=$(CPP)
- CPPFLAGS += -I$(AGCC)/bionic/libstdc++/include
- CFLAGS += -I$(AGCC)/system/core/include
- CFLAGS += -I$(AGCC)/hardware/libhardware/include
- CFLAGS += -I$(AGCC)/hardware/ril/include
- CFLAGS += -I$(AGCC)/dalvik/libnativehelper/include
- CFLAGS += -I$(AGCC)/frameworks/base/include
- CFLAGS += -I$(AGCC)/external/skia/include
- CFLAGS += -I$(AGCC)/out/target/product/generic/obj/include
- CFLAGS += -I$(AGCC)/bionic/libc/arch-arm/include
- CFLAGS += -I$(AGCC)/bionic/libc/include
- CFLAGS += -I$(AGCC)/bionic/libc/kernel/common
- CFLAGS += -I$(AGCC)/bionic/libc/kernel/arch-arm
- CFLAGS += -I$(AGCC)/bionic/libm/include
- CFLAGS += -I$(AGCC)/bionic/libm/include/arch/arm
- CFLAGS += -I$(AGCC)/bionic/libthread_db/include
- CFLAGS += -I$(AGCC)/bionic/libm/arm
- CFLAGS += -I$(AGCC)/bionic/libm
- CFLAGS += -I$(AGCC)/out/target/product/generic/obj/SHARED_LIBRARIES/libm_intermediates
- CFLAGS += -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID -DSK_RELEASE -DNDEBUG
- CFLAGS += -include $(AGCC)/system/core/include/arch/linux-arm/AndroidConfig.h
- CFLAGS += -UDEBUG -march=armv5te -mtune=xscale -msoft-float -mthumb-interwork -fpic -fno-exceptions -ffunction-sections -funwind-tables -fstack-protector -fmessage-length=0 -Bdynamic
- LDFLAGS += -Wl,-T,$(AGCC)/build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--no-undefined -Wl,-rpath-link=$(AGCC)/out/target/product/generic/obj/lib
- LDFLAGS += -L$(AGCC)/out/target/product/generic/obj/lib -nostdlib $(AGCC)/out/target/product/generic/obj/lib/crtend_android.o $(AGCC)/out/target/product/generic/obj/lib/crtbegin_dynamic.o $(AGCC)/prebuilt/darwin-x86/toolchain/arm-eabi-4.2.1/lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a
- LDFLAGS += -lutils -lc -lm -lstdc++
- all: $(APP)
- OBJS += $(APP).o
- $(APP): $(OBJS)
- $(LD) $(LDFLAGS) -o $@ $^
- %.o: %.c
- $(CC) -c $(CFLAGS) $< -o $@
- %.o: %.cpp
- $(CPP) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
- install: $(APP)
- $(SDKTOOL)/adb push $(APP) /data/local/bin/$(APP)
- $(SDKTOOL)/adb shell chmod 755 /data/local/bin/$(APP)
- run:
- $(SDKTOOL)/adb shell /data/local/bin/$(APP)
- clean:
- @rm -f $(APP).o $(APP)
|
hello.cpp
复制代码
- #include <stdio.h>
- #include <utils/String8.h>
- using namespace android;
- int main()
- {
- String8 str = String8("Hello Android/n");
- str += "Hello C++/n";
- str.append("/n... Android gcc toolchain .../n");
- printf(str);
- return 0;
- }
|
测试 hello.cpp
复制代码
- make APP=hello
- make APP=hello install run
|
agcc