NDK相关组件及作用

来源:互联网 发布:手机陶笛软件 编辑:程序博客网 时间:2024/06/05 00:39

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

 

 

 

1 0