Android JNI 和 NDK

 

一、Android NDKhtml

 1、NDK产生的背景java

  Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能使用Java”。在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用彻底能够经过JNI调用本身的C动态库,即在Android平台上,“Java+C”的编程方式是一直均可以实现的。android

  不过,Google也表示,使用原生SDK编程相比Dalvik虚拟机也有一些劣势,Android SDK文档里,找不到任何JNI方面的帮助。即便第三方应用开发者使用JNI完成了本身的C动态连接库(so)开发,可是so如何和应用程序一块儿打包成apk并发布?这里面也存在技术障碍。好比程序更加复杂,兼容性难以保障,没法访问Framework API,Debug难度更大等。开发者须要自行斟酌使用。c++

  因而NDK就应运而生了。NDK全称是Native Development Kit。算法

  NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。NDK将是Android平台支持C开发的开端。编程

 

2、为何使用NDK并发

  1.代码的保护。因为apk的java层代码很容易被反编译,而C/C++库反汇难度较大。编程语言

  2.能够方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。工具

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

  4.便于移植。用C/C++写得库能够方便在其余的嵌入式平台上再次使用。

 

3、NDK简介

       1.NDK是一系列工具的集合

       NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一块儿打包成apk。这些工具对开发者的帮助是巨大的。

NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差别,开发人员只须要简单修改mk文件(指出“哪些文件须要编译”、“编译特性要求”等),就能够建立出so。

NDK能够自动地将so和Java应用一块儿打包,极大地减轻了开发人员的打包工做。

       2.NDK提供了一份稳定、功能有限的API头文件声明

       Google明确声明该API是稳定的,在后续全部版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能很是有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。

 

4、NDK开发环境的搭建

1.下载安装Android NDK

 地址:http://developer.android.com/sdk/ndk/index.html

 

二、Android JNI

 native    国的;土著的;自然的;与生俱来的;天赋的

 Native App 本地应用 ; 原生应用 ; 客户端应用 ; 原生应用程式

 

一:基本概念

JNI : Java Native Interface (JNI)标准是java平台的一部分,它容许Java代码和其余语言写的代码进行交互。

         JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码可以与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操做。

 

二:Android JNI 通常用途为:


一、主要是一些算法,由于c/c++比Java效率高,因此应用运行起来速度比较快,特别是一些游戏中的算法。
二、为了保密,都知道apk均可以被反编译,就算有代码混淆,也只是难看懂,并非彻底看不懂,但用jni编译成.so就不一样了,因此能够达到商业机密不泄露的目的。
三、一个平台(C++代码)迁移到Android平台,底层逻辑是相同的,这样就能够经过移植,利用JNI调用底层C++代码,避免相同逻辑的代码重复去写,不过这个过程必定要注意底层对象的释放问题。

 

 三、NDK 与 JNI 的关系

 

JNI是java语言提供的Java和C/C++相互沟通的机制,Java能够经过JNI调用本地的C/C++代码,本地的C/C++的代码也能够调用java代码。

JNI 是本地编程接口,Java和C/C++互相经过的接口。Java经过C/C++使用本地的代码的一个关键性缘由在于C/C++代码的高效性。

 

NDK是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一块儿打包成apk。这些工具对开发者的帮助是巨大的。

它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差别,开发人员只须要简单修改mk文件(指出“哪些文件须要编译”、“编译特性要求”等),就能够建立出so。

它能够自动地将so和Java应用一块儿打包,极大地减轻了开发人员的打包工做。

相关文章
相关标签/搜索