ndk编译android上运行的c程序

来源:互联网 发布:java输入一个数组 编辑:程序博客网 时间:2024/04/19 11:11

上次工作中需要编译一个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设备上即可运行。

 

原创粉丝点击