您的位置:首页 > 移动开发 > Android开发

ndk编译android上运行的c程序

2013-01-17 11:23 288 查看
上次工作中需要编译一个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.mkLOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:= hello.cLOCAL_MODULE:= helloLOCAL_FORCE_STATIC_EXECUTABLE := true#LOCAL_STATIC_LIBRARIES := libc#LOCAL_CFLAGS += -Iinclude/dir -DSOMEFLAGSinclude $(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设备上即可运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: