下载来的NDK包里有一份介绍NDK内容的文档 《Android NDK Dev Guide》,这里摘记一些信息做个备忘
NDK提供一组工具帮助开发者把使用C/C++开发的代码嵌入到我们开发的android应用中,仅能在1.5以上的Android系统中使用,不过现在市场上的绝大多数设备都是1.5版本以上了,看起来这不是个问题。
NDK开发的步骤概括
- 把C/C++源代码放到$PROJECT_PATH/jni目录下,这些源代码都要按照jni的规范来编写
- 编写$PROJECT_PATH/jni/Android.mk文件内容,这个文件用于将C/C++代码组织成module,module是指static library 或者 shared library。每个Android.mk文件内可以定义一个或多个module,同样的源代码也可以用于多个module
- 编写$PROJECT_PATH/jni/Application.mk文件内容(可选)
- 在项目目录下运行$NDK_PATH/build
- 默认情况下NDK会把编译产生的中间文件放在$PROJECT_PATH/jni/obj目录下面,可以通过NDK_OUT环境变量设置成其他目录。
Android.mk
一个比较典型的Android.mk文件内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
Android.mk文件的第一行必须是变量LOCAL_PATH的定义,这个变量用于定位源代码。
my-dir是由build system提供的一个宏,它表示Android.mk文件所在的目录。
include $(CLEAR_VARS)
CLEAR_VARS是由build system提供的并指向一个特殊的GNU Make script,它可以清除掉除了LOCAL_PATH之外很多LOCAL_XXX形式的变量(如LOCAL_MODULE, LOCAL_SRC_FILES 等等)。
LOCAL_MODULE := hello-jni
每个module都需要有一个LOCAL_MODULE变量来定义module的名字,多个module的值必须要是不重复的,名字中也不能携带空格。build system会自动给编译出来的module文件加入前缀和后缀,比如这里可能就编译出来libhello-jni.so
LOCAL_SRC_FILES := hello-jni.c
这里是设置要编译进module的源文件列表,只列出源文件
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY也是build system提供的,指向一个特殊的GNU Make script。它会收集CLEAR_VARS之后的所有LOCAL_XXX的信息,决定如何build,产生的是shared library。
还有一个BUILD_STATIC_LIBRARY用来产生static library的。
Application.mk
NDK支持使用C++来开发,但是默认使用了一个非常小的C++运行时库。这个库不支持stl,不支持exception,不支持rtti。所以当代码中需要用到这些部分时,我们得做出点改变。
目前NDK提供了一共7种选择,下面列出了这7种选择,我们可以在Application.mk文件里通过APP_STL来定义要使用的库
system -> Use the default minimal system C++ runtime library.
gabi++_static -> Use the GAbi++ runtime as a static library.
gabi++_shared -> Use the GAbi++ runtime as a shared library.
stlport_static -> Use the STLport runtime as a static library.
stlport_shared -> Use the STLport runtime as a shared library.
gnustl_static -> Use the GNU STL as a static library.
gnustl_shared -> Use the GNU STL as a shared library.
撇开static 和 shared的区分,实际上NDK一共提供了4个不同的实现,这些实现支持的特性也不一样
C++ C++ Standard
Exceptions RTTI Library
system no no no
gabi++ no yes no
stlport no yes yes
gnustl yes yes yes
C++ Exceptions support
NDK是支持C++ Exception的,从NDK r5开始默认是未开启这个功能的。如果我们的代码里用到了Exception功能 ,出了要选择一个gnustl外,还要在Application.mk里加入 APP_CPPFLAGS += -fexceptions
RTTI support
类似exception,要使用RTTI功能,除了选择一个支持RTTI的library实现,还要在Application.mk里加入 APP_CPPFLAGS += -frtti
分享到:
相关推荐
Android NDK 开发的官方文档 (android ndk dev guide)。 阅读文档请点击documentation.html。
android ndk beginner guide
Android Studio 2.1 开发NDK,使用实验版本gradle插件
Android NDK编程入门笔记 开发环境的搭建
Android NDK Beginner's Guide源码,第二部分。
Android NDK Beginner’s Guide第五章完整源码
android NDK开发指导,可以做参考资料备用,不要分的
AndroidNDK学习笔记.pdf
Android.NDK.Beginners.Guide.2nd.Edition
Android NDK 安装以及 HelloWorld!测试
android ndk开发笔记 你懂的 介绍了ndk开发的过程
NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk,并集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件
Android NDK 开发时需要的 常用的JNI API
Android_ NDK编程入门笔记
使用Android NDK编译Android平台的eXosip库,有静态库和动态库。
android ndk 使用方法android ndk 使用方法
博客名称 : 【Android NDK 开发】在 C 代码中获取 Android 系统信息 ( NDK 项目创建 | NDK 配置 | 获取 Android 系统版本号 ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/102933704
这个虽然只是个简单的jnidemo、但是涵盖了Android.mk 和Application.mk 的原理 重点是Android NDK编译的理解 mac 系统下 切换到jni目录,然后呢个 ndk-build
valgrind for android NDK, 由国外相关资源整理,并亲测试可用,只支持 arm 架构.
ndk网盘下载,方便不能科学上网的同学下载。包含Windows和Mac版本。版本号r14-r20,全部下载搬运自谷歌Android官网。下载后是一个文本文件,用文本编辑器打开即可看到网盘下载地址。