天天看点

Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程

终于回到我们的 android了,我们先要配置这个ndk的环境,但是之前,我们还要了解一下基本的术语

在一个平台下编译出另一个平台可以执行的二进制程序

cpu平台:arm x86 mips(指令集)

系统平台:windows linux mac

原理:模拟另一个平台的特性去编译程序

源代码——>预编译——>编译——>链接——>可执行程序

工具链:一个工具使用自动调用下一个

ndk : native developer kits

cdt : c/c++ developer tools(插件/高亮显示c关键字)

cygwin:windows下的linux模拟器(rom系列有讲)

Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程
android平台从诞生起,就已经支持c、c++开发。众所周知,android的sdk基于java实现,这意味着基于android sdk进行开发的第三方应用都必须使用java语言。但这并不等同于“第三方应用只能使用java”。在android sdk首次发布时,google就宣称其虚拟机dalvik支持jni编程方式,也就是第三方应用完全可以通过jni调用自己的c动态库,即在android平台上,“java+c”的编程方式是一直都可以实现的。 不过,google也表示,使用原生sdk编程相比dalvik虚拟机也有一些劣势,android sdk文档里,找不到任何jni方面的帮助。即使第三方应用开发者使用jni完成了自己的c动态链接库(so)开发,但是so如何和应用程序一起打包成apk并发布?这里面也存在技术障碍。比如程序更加复杂,兼容性难以保障,无法访问framework api,debug难度更大等。开发者需要自行斟酌使用。 于是ndk就应运而生了。ndk全称是native development kit。 ndk的发布,使“java+c”的开发方式终于转正,成为官方支持的开发方式。ndk将是android平台支持c开发的开端。

1.代码的保护。由于apk的java层代码很容易被反编译,而c/c++库反汇难度较大。

2.可以方便地使用现存的开源库。大部分现存的开源库都是用c/c++代码编写的。

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

4.便于移植。用c/c++写得库可以方便在其他的嵌入式平台上再次使用。

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)。
我们先下载安装ndk吧!
我们下载好之后就直接解压
Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程
我们来分析一下

docs:帮助文档

build/tools:linux批处理文件

platforms:存放jni用到的h头文件和so类库

prebuilt:预编译使用的工具

samples:小例子

sources:ndk的部分源码

toolchains:工具链

ndk-build.cmd:编译打包c代码

其实跟sdk还是类似的,我们就不细说了
我们来创建自己的第一个jni工程,我们在eclipse中新建一个工程——hellojni,额,问我为什么不用android studio,这个…..还不是很熟练,因为工作需要,一直用的是eclipse,看ndk的文件夹下的例子我们知道,首先,我们要创建一个jni的目录,我们新建
Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程
我们新建一个c类,再次之前,我们先看一下api里的哪个hello-jni的例子中c程序是怎么写的
这里,前面是注释,不用管,我们看最后的return,我们在jni的目录下写一个c文件
写完之后,我们运行是没用的,我们这里是需要手动编译的
Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程
我们进入我们的源文件目录下,打开cmd,输入ndk-build.cmd去编译,他会报一个错误,原因是路径,我们缺少了一个mk文件,要创建这个文件,我们需要查看一下android-mk.html的文档,我们在jni目录下新建一个android.mk文件,把这段话复制进去
现在,我们可以编译了,编译完成之后,libs目录下会有一个动态的链接库
Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程
我们执行的就是这个库 当然,我们现在还需要去加载动态链接库,我们回到mainactivity
然后我们可以使用了
但是这里运行的话需要arm平台的,你在x86平台上是没用的,文章前面也说了,如果大家编译晕倒困难,那就是相关配置没配好,这里推荐 <a href="http://www.cnblogs.com/skyseraph/p/3979238.html">http://www.cnblogs.com/skyseraph/p/3979238.html</a> 配置环境百度很多的