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

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
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android ndk jni