NDK相关组件及作用
2016-07-29 18:21
405 查看
NDK相关组件及作用
ndk-build:NDK编译脚本,能够自动搜索那些文件需要编译,生成二进制文件和把二进制文件复制到工程目录下。
Java:Android会把java源代码build成.dex文件,这是Android系统在Dalvik Virtual Machine(DVM)上运行的文件
Native static libraries:本地静态库,NDK能够生成静态库或者.a文件,可以利用它链接到其他库。
Java Native Interface (JNI):java本地接口,java和C++代码交流的接口。
Application Binary Interface (ABI):应用程序二进制接口,描述了应用程序和操作系统的运行时交互。NDK支持ARMEABI,MIPS,X86三种ABI接口。
Manifest:如果应用程序中没有java组件,那么必须在Manifest中声明NativeAcitivity。
在ndk-build和ndk-gdb时需要下面两个:
Android.mk:必须在jni目录下创建一个Android.mk配置文件,ndk-build时用到这个文件的信息,向buildsystem描述源库和共享库。是一个小的GNU makefile 能够被build system解析一次或多次。Android.mk文件能够定义project-wide 的设置。包括Application.mk,build system 和环境变量没有的定义或者为特定的模块重写设置。
Application.mk:列举和描述你的应用需要的模块,包括:指定平台的ABI,工具链,包含的标准库。Application.mk是一个小的GNU makefile fragment 定义了编译所需的变量。通常放在project/jni目录下
开发NDK应用的基本流程
1. 设计哪些用java实现,哪些用c、c++实现。
2. 创建一个Android工程
3. 如果适一个没有java的工程,则在Manifest中声明NativeAcitivity。
4. 创建一个Android.mk文件描述本地库,包括名字,标志,链接库,和需要编译的源文件。
5. 通常还需要创建一个Application.mk文件,配置目标ABI,工具链,release/debug 模式,STL,默认值为:
ABI: armeabi
Toolchain: GCC 4.8
Mode: Release
STL: system
6. 放置native code 在jni目录下
7. 使用ndk-build 编译本地库(.so .a)
8. 编译java组件,生成.dex文件
9. 打包.so和.dex和其他相关的文件成APK
一个NativeActivity除了能够通过JNI调用Android framework APIs,还能直接调用NDK提供的本地接口而不通过JNI。
Android NDK 提供了两种方法实现NativeActivity
1. 利用 native_activity.h提供的回调接口和数据结构,注意所有回调都是在主线程调用,所以要防止阻塞
2. 利用 android_native_app_glue.h提供的回调和数据结构,这个会新开一个线程处理回调。
跟多信息看https://developer.android.com/ndk/guides/concepts.html
Building
Android.mk:语法允许你把源码分组成模块,一个模块能够包含静态库,动态库,或者独立可执行文件。允许在一个Android.mk文件中定义多个模块,或者在多个模块中使用一个源文件。bulid system只会把动态库加载到APK中,静态库可以生成动态库。
语法:
1. 以LOCAL_PATH开始
LOCAL_PATH := $(call my-dir)
其中my-dir是一个宏,有build system提供,代表当前Android.mk所在目录
2. 下一行声明CLEAR_VARS变量,其值由build system提供
include$(CLEAR_VARS)
CLEAR_VARS变量指向一个特殊的GNU Makefile帮助你清除许多LOCAL_XXX变量,如LOCAL_MODULE, LOCAL_SRC_FILE, LOCAL_STATIC_LIBRARIES等。但不清除LOCAL_PATH。该变量必须保持值不变,因为系统解析所有的build 控制文件在一个GNU 执行文件里,所有的变量都是全局变量。每个模块之前都必须重新声明。
3. 下一步,LOCAL_MODULE 变量保存你想build的模块的名字,一个模块一个名字
如:LOCAL_MODULE := hello-jni
模块名字不能含有空格。当build system 生成最终动态库的时候,自动添加适当的前缀和后缀在你的LOCAL_MODULE上,如上面的代码将生成 libhello-jni.so
4. 下一步,列出源文件,以空格分隔
LOCAL_SRC_FILES: =hello-jni.c
LOCAL_SRC_FILES文件必须包含module build需要的一系列的c和c++文件。
5. 最后一行帮助system打包
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY指向GNU Makefile脚本包含了从最近的一个include开始所有你定义的LOCAL_XXX变量。脚本决定了什么需要build和怎么build。
更多的例子,如怎么编写native-activity的mk文件,请看https://developer.android.com/ndk/guides/android_mk.html#var
Application.mk:
ndk-build:一个shell脚本,目的是调用正确的NDK build脚本
调用ndk-build等效于命令行:
$GNUMAKE –f <ndk>/build/core/build-local.mk<parameters>
其中<ndk>指向NDK安装目录
Standalone Toolchain
ndk-build:NDK编译脚本,能够自动搜索那些文件需要编译,生成二进制文件和把二进制文件复制到工程目录下。
Java:Android会把java源代码build成.dex文件,这是Android系统在Dalvik Virtual Machine(DVM)上运行的文件
Native static libraries:本地静态库,NDK能够生成静态库或者.a文件,可以利用它链接到其他库。
Java Native Interface (JNI):java本地接口,java和C++代码交流的接口。
Application Binary Interface (ABI):应用程序二进制接口,描述了应用程序和操作系统的运行时交互。NDK支持ARMEABI,MIPS,X86三种ABI接口。
Manifest:如果应用程序中没有java组件,那么必须在Manifest中声明NativeAcitivity。
在ndk-build和ndk-gdb时需要下面两个:
Android.mk:必须在jni目录下创建一个Android.mk配置文件,ndk-build时用到这个文件的信息,向buildsystem描述源库和共享库。是一个小的GNU makefile 能够被build system解析一次或多次。Android.mk文件能够定义project-wide 的设置。包括Application.mk,build system 和环境变量没有的定义或者为特定的模块重写设置。
Application.mk:列举和描述你的应用需要的模块,包括:指定平台的ABI,工具链,包含的标准库。Application.mk是一个小的GNU makefile fragment 定义了编译所需的变量。通常放在project/jni目录下
开发NDK应用的基本流程
1. 设计哪些用java实现,哪些用c、c++实现。
2. 创建一个Android工程
3. 如果适一个没有java的工程,则在Manifest中声明NativeAcitivity。
4. 创建一个Android.mk文件描述本地库,包括名字,标志,链接库,和需要编译的源文件。
5. 通常还需要创建一个Application.mk文件,配置目标ABI,工具链,release/debug 模式,STL,默认值为:
ABI: armeabi
Toolchain: GCC 4.8
Mode: Release
STL: system
6. 放置native code 在jni目录下
7. 使用ndk-build 编译本地库(.so .a)
8. 编译java组件,生成.dex文件
9. 打包.so和.dex和其他相关的文件成APK
一个NativeActivity除了能够通过JNI调用Android framework APIs,还能直接调用NDK提供的本地接口而不通过JNI。
Android NDK 提供了两种方法实现NativeActivity
1. 利用 native_activity.h提供的回调接口和数据结构,注意所有回调都是在主线程调用,所以要防止阻塞
2. 利用 android_native_app_glue.h提供的回调和数据结构,这个会新开一个线程处理回调。
跟多信息看https://developer.android.com/ndk/guides/concepts.html
Building
Android.mk:语法允许你把源码分组成模块,一个模块能够包含静态库,动态库,或者独立可执行文件。允许在一个Android.mk文件中定义多个模块,或者在多个模块中使用一个源文件。bulid system只会把动态库加载到APK中,静态库可以生成动态库。
语法:
1. 以LOCAL_PATH开始
LOCAL_PATH := $(call my-dir)
其中my-dir是一个宏,有build system提供,代表当前Android.mk所在目录
2. 下一行声明CLEAR_VARS变量,其值由build system提供
include$(CLEAR_VARS)
CLEAR_VARS变量指向一个特殊的GNU Makefile帮助你清除许多LOCAL_XXX变量,如LOCAL_MODULE, LOCAL_SRC_FILE, LOCAL_STATIC_LIBRARIES等。但不清除LOCAL_PATH。该变量必须保持值不变,因为系统解析所有的build 控制文件在一个GNU 执行文件里,所有的变量都是全局变量。每个模块之前都必须重新声明。
3. 下一步,LOCAL_MODULE 变量保存你想build的模块的名字,一个模块一个名字
如:LOCAL_MODULE := hello-jni
模块名字不能含有空格。当build system 生成最终动态库的时候,自动添加适当的前缀和后缀在你的LOCAL_MODULE上,如上面的代码将生成 libhello-jni.so
4. 下一步,列出源文件,以空格分隔
LOCAL_SRC_FILES: =hello-jni.c
LOCAL_SRC_FILES文件必须包含module build需要的一系列的c和c++文件。
5. 最后一行帮助system打包
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY指向GNU Makefile脚本包含了从最近的一个include开始所有你定义的LOCAL_XXX变量。脚本决定了什么需要build和怎么build。
更多的例子,如怎么编写native-activity的mk文件,请看https://developer.android.com/ndk/guides/android_mk.html#var
Application.mk:
ndk-build:一个shell脚本,目的是调用正确的NDK build脚本
调用ndk-build等效于命令行:
$GNUMAKE –f <ndk>/build/core/build-local.mk<parameters>
其中<ndk>指向NDK安装目录
Standalone Toolchain
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题