上次工作中需要编译一个C项目,运行在android的shell上。当时的做法是从android编译环境中分离工具链,拷贝出prebuilt下的ara-eabi-gcc、拷贝出out下bionic生成的一些so文件、以及bionic的头文件。这样做起来很麻烦。
今天偶尔看到ndk,发现ndk可以完成这个任务。
1. 下载安装ndk
从android.com上下载最新的ndk包:
# wget http://dl.google.com/android/ndk/android-ndk-r7-linux-x86.tar.bz2
# tar xvfj android-ndk-r7-linux-x86.tar.bz2
然后将ndk根路径加入到PATH
2. 编译hello-jni工程
ndk带的sample中有hello-jni工程,它包含java代码和一些函数的jni实现。编译jni时需要用ndk。
编译jni:
# ndk-build
这时会提示awk错误:
prebuilt/linux-x86/bin/awk: 4: Syntax error: word unexpected (expecting “)”)
从http://stackoverflow.com/questions/8116113/problems-with-android-ndk-7-and-awk的信息看,这个akw是for x86_64的,所以运行有问题。只需要禁掉它,主机的awk就可以了:
# mv prebuilt/linux-x86/bin/awk prebuilt/linux-x86/bin/awk64
再次执行ndk-build就会成功在hello-jni/libs下生成so文件。用ant debug就会编译java文件,并将生成的jni so文件打包到apk。
3. 编译一个独立的hello程序
创建目录hello/jni,在jni下创建hello.c和Android.mk:

// hello.c
#include <stdio.h>

int main()
{
printf(“hello\n”);

return 0;
}

// Android.mk
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_SRC_FILES:= hello.c
LOCAL_MODULE:= hello

LOCAL_FORCE_STATIC_EXECUTABLE := true
#LOCAL_STATIC_LIBRARIES := libc
#LOCAL_CFLAGS += -Iinclude/dir -DSOMEFLAGS

include $(BUILD_EXECUTABLE)

注意:jni目录是必须的,否则ndk-build会编译出错,报告:
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
/Developer/android-ndk-r4b/build/core/build-local.mk:85: *** Android NDK: Aborting    .  Stop.
执行ndk-build后,会生成可执行文件hello,push到android设备上即可运行。
link: http://leave001.blog.163.com/blog/static/16269129320111128113217384/