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设备上即可运行。
今天偶尔看到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设备上即可运行。
相关文章推荐
- NDK编译Android上运行的C可执行程序
- NDK-在android程序运行时打LOG
- Android 运行 C/C++程序 (使用 arm-linux-gcc 交叉编译环境)
- Android JNI 编译正确 但是提示程序有错误无法运行 而且还看不到任何错误提示 的解决方法
- Android JNI 编译正确 但是提示程序有错误无法运行 而且还看不到任何错误提示 的解决方法
- 怎样用 C/C++ 开发一个原生程序运行在 Android 下而不用 ADK、NDK
- 如何指定让Android的NDK工具编译出Release版本或Debug版本的Native程序
- Android编译运行Native程序详解
- 高通snapdragon平台下编译生成运行Android可执行程序小白教程
- android-ndk-r6编译运行NDK例子
- 怎样用 C/C++ 开发一个原生程序运行在 Android 下而不用 ADK、NDK
- 借助交叉编译用C编译Android上运行的程序
- 安装交叉编译工具arm-none-linux-gnueabi-gcc——Linux上编译在android上运行的c程序
- 闲来无事,塔建了一下android ndk和简单的编译并安装运行apk
- android之NDK(jni)开发笔记1——运行第一个NDK程序
- Android NDK-r5 成功运行编译运行第一个NDK程序
- NDK编译Android字符界面的可执行程序
- Android 运行 C/C++程序 (使用 arm-linux-gcc 交叉编译环境)
- Android NDK编译带STL的 C/C++ 程序
- 怎样用 C/C++ 开发一个原生程序运行在 Android 下而不用 ADK、NDK