NDK简介

NDK(Native Development Kit)是一套工具集,允许你在Android应用中嵌入c或c++。

使用NDK的好处主要有以下4点:

  • 安全:由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。

  • 重用:可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。

  • 效率:将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

  • 移植:用C/C++写得库可以方便在其他的嵌入式平台上再次使用。


NDK关键词

ndk-build:

这个shell构建脚本是NDK的核心。

  • 它决定需要去构建什么
  • 生成二进制文件
  • 拷贝二进制文件到项目目录

Native shared libraries:

本地共享库,本地代码经过编译后生成的二进制文件.so``.dll

Native static libraries:

本地静态库,用来连接其他代码库

Java Native Interface (JNI):

Java平台的重要特性,允许Java代码和其他本地语言进行交互,如c/c++

Application Binary Interface (ABI)::

定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上。在Android系统上,每一种CPU架构对应一个ABI:

armeabi(默认),armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64。

Android.mk:

必备组件,在jni文件夹下,用来描述NDK构建系统。ndk-build脚本从该文件中读取定义的模块,名字和需要编译的资源文件等。

Application.mk:

可选构建文件,和Android.mk一样,放在jni目录下,这个文件列举和描述了你应用模块所需的东西,如指定的ABIs编译平台,工具链等。


编写NDK流程


Eclipse中NDK使用流程

  • 创建Android项目,创建java文件,并声明本地方法

  • 编译,得到.class文件

  • 使用javah命令,生成jni目录和.h头文件

  • 在jni目录下创建c/c++文件,引入头文件,编写本地方法的实现

  • 创建Android.mk,用来描述你要在jni目录下生成的本地库

  • 创建Application.mk(可选)来配置目标ABIs, toolchain, release/debug mode, STL等

  • 使用ndk-build脚本将c/c++文件编译成本地库.so

  • 打包,运行程序


Android Studio使用流程(Deprecated)

现在Anroid Studio已经支持全新的NDK使用,旧的方法已经被标为废弃。但新方法还在实验阶段,所以旧方法依旧重要!

创建java文件,并声明本地方法

public class JNIHelper {
public static native String getStringFromNative();
}

编译,得到.class文件

生成地址:YourApplication\app\build\intermediates\classes\debug

根据生成的class文件,利用javah 生成对应的 .h头文件

打开termianl执行:

javah -d jni -classpath /Users/DeanGuo/TestNDK/app/build/intermediates/classes/debug com.dean.testndk. JNIHelper

成功后会生成一个jni目录,目录下会有一个com_dean_testndk_JNIHelper.h头文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_dean_testndk_JNIHelper */ #ifndef _Included_com_dean_testndk_JNIHelper
#define _Included_com_dean_testndk_JNIHelper
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_dean_testndk_JNIHelper
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_dean_testndk_JNIHelper_getStringFromNative
(JNIEnv *, jclass); #ifdef __cplusplus
}
#endif
#endif

编写c/c++文件,来实现头文件中的方法

#include "com_dean_testndk_JNIHelper.h"

JNIEXPORT jstring JNICALL Java_com_dean_testndk_JNIHelper_getStringFromNative
(JNIEnv * env, jobject jclass) {
return (*env)->NewStringUTF(env, "return from native c");
}

编译生成.so文件

传统方法是使用Android.mk,Application.mk进行配置,最后通过ndk-build脚本来生产.so本地库。

使用Android Studio可以将配置和执行脚本的工作都交给Gradle。

打开工程的build.gradle配置文件,在defaultConfig中添加ndk标签用来配置.so的名字和abi架构,如下:

    defaultConfig {
applicationId "com.dean.testndk"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0" ndk{
moduleName "test" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //指定abi体系结构下的so库,不指定使用默认方案
// stl "stlport_shared"
// ldLibs "log", "z", "m"
// cFlags "-I/some/include/path"
}
}

目前需要在grade.properties中添加android.useDeprecatedNdk=true(因为目前Android Studio推出了新的ndk支持,下一篇会讲到)

生成好的so文件可以在app/build/intermediates/ndk/debug/lib中看到。

编写代码,打包执行

本地库已经生成,现在就通过代码来加载使用了:

public class MainActivity extends AppCompatActivity {

    static {
System.loadLibrary("test");
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("ndk_log : ", JNIHelper.getStringFromNative());
}
}

执行后控制台打印:I/ndk_log :: return from native c


总结:

相比Eclipse,使用Android Stuido更加直观方便。“基本”可以忽略Android.mk,Application.mk的编写与配置。而新版的NDK支持将更加强大,将会在下一篇文章介绍。

NDK开发-简介&环境搭建(Eclipse,Android Studio)的更多相关文章

  1. 重拾安卓_01_安卓开发环境搭建(android studio)

    一.下载安装SDK 参考:搭建Android开发环境——Eclipse  的安装SDK部分 二.安装android studio 参考: Android Studio 入门级教程(一) 三.andro ...

  2. windows8.1下android开发环境搭建(Eclipse+Android sdk+ADT+Genymotion)

    一.基本jdk.eclipse环境 二.android sdk 1.下载安装:https://developer.android.com/sdk/installing/index.html?pkg=t ...

  3. NDK学习一: 环境搭建Eclipse篇

    下载NDK 国内的一个镜像站点 下载速度比较快 http://wear.techbrood.com/tools/sdk/ndk/#Installing 网上搭建环境的方案有很多 1. Eclipse ...

  4. mac下android环境搭建笔记(android studio)

    本文记录了本人在mac上配置android开发环境的一些过程,为了方便直接选用了官方的IDE– Android Studio .本文包括了android studio的安装.创建第一个hello wo ...

  5. 安卓学习第一节--环境搭建及Android Studio 安装

    1.安装JDK 2.安装AS 安装参考网址 https://www.cnblogs.com/xiadewang/p/7820377.html 下载网址: http://www.android-stud ...

  6. Android环境的搭建及Android Studio的安装

    菜鸟初来报到,写了一篇关于Android环境搭建和Android Studio安装的内容(写好很久了,一直没发).仅供想开发Android,却又不知如何搭建环境的小白们参考,高手们就请绕行吧.在此献丑 ...

  7. Ubuntu 12.04 搭建 Eclipse Android 开发环境(转)

    Ubuntu 12.04 搭建 Eclipse Android 开发环境 http://blog.sina.com.cn/s/blog_93dc666c0101b39p.html (2012-09-0 ...

  8. [Android] 环境配置之基础开发环境(SDK/Android Studio)(转)

    [Android] 环境配置之基础开发环境(SDK/Android Studio)   博客: blog.csdn.net/qiujuer 网站: www.qiujuer.net 开源库: Geniu ...

  9. Android NDK r8 windows环境搭建

    Android NDK r8 windows环境搭建 一.默认基础环境为已经完成Android开发环境的搭建 需要的软件及插件 1. JDK-7u25 2. Eclipse 3. Android SD ...

随机推荐

  1. JS里面的两种运动函数

    最新学了一个新的运动函数,与最初学习的有所不同,第一个运动是根据运动速度完成运动 ,第二个则是根据运动的时间来完成运动,而且把之前的函数都进行了一些兼容处理,在这里列出了看一下: 第一种animate ...

  2. 基于华清远见STM32f051的 IIC从模式实现方法

    作者:卢老师,华清远见嵌入式学院讲师. 在大多情况下,我们使用MCU控制传感器,节点以及相关从设备,但在较为复杂的系统中,有时候也会使用MCU做为从设备. 下面是关于stm32f051的从模式实现方法 ...

  3. 《bootstrap》实战---作为了解

    感觉这句话说的挺有道理,"一些最佳实践不管是语义标记还是移动优先的设计,抑或资源性能优化,都需要额外的时间和精力才能时间".用心做,才会做好.

  4. 修改ie的默认值 为ie10

    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE10" />

  5. Activity与Fragment

    Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似. Fragment是用来描述一些行为或一部分用户界面在一个Activi ...

  6. virtualenv

    问题:python开发过程中,需要安装各类依赖 逐个安装依赖,操作复杂,并可能会出现版本不一致的问题 解决:virtualenv可以有效解决上述问题 使用方法: 安装: pip install vir ...

  7. Go-Agent部署与FQ教程(2016-10-28)

    这篇文章是为了帮助使用go-agent-crack来FQ的同学,主要是几个想用该项目来FQ的同学对github主页的FQ文档大力吐槽,索性写一篇详细的文档来支持一下大家,其中包含了google gae ...

  8. 一篇UI规范文件

    一篇UI规范文件 这是一个UI模板规范,在做B/S版应用程序时比较适用,其实这样的东西算不上什么正规的规范,只是为了适应我们现在面对的开发环境和组织流程做的一些权宜的努力,和解决了一些与程序沟通和接口 ...

  9. 转一个PDevMode格式属性说明...

    找不到原始来源了... //PDevMode = _devicemodeW; // _devicemodeW = record // dmDeviceName: array[0..CCHDEVICEN ...

  10. mongodb数据库迁移

    如果遇到权限问题,终极解决办法:关掉权限! 如:assertion: 18 { ok: 0.0, errmsg: "auth failed", code: 18 }等错误