1.JNI和JDK的初认识:
JNI:java调用C,C++的代码技术,但是光能调用不行,首先你得生成被调用的东西,你的应用需要打包发布。对于开发人员来说,这些事情越方便越好。最早期Android的官方没有明确支持和明确不支持打包发布方式,或者可以这样说google没有提供很好的C/C++(SO)代码与java代码一起打包发布、调试等等的方式,NDK的出现就解决了这个问题。NDK能把c/c++代码编译成android JNI调用所需的.so文件。google官方提供打包发布并承诺提供好的可调试方式,并且NDK的出现,使得开发人员完全可以用c、c++代码开发一个应用或游戏而不用写一句java代码。
2.一个JNI代码的运行流程是怎么样的?
上图1很好的回答了这个问题。
额外知识:
(1).用C写的应用,代码部分包括源文件(.c)和头文件(.h),C++的是一个.h和.cpp文件。其它还包括一些第三方类库,资源文件等。
3.JNI是什么?
就是在java里声明的一个native的方法和载入本地库,这个方法不用写实现,实现在本地库里写。
例子:
class HelloWorld { public native void displayHelloWorld();//所有native关键词修饰的都是对本地的声明 static { System.loadLibrary("hello"); //载入本地库 } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); }}
4.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)。
5.NDK能带来什么?
(1)NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。
使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。使用NDK,我们可以将需要保密的应用逻辑使用C开发。毕竟,Java包都是可以反编译的。NDK促使专业so组件商的出现。(乐观猜想,要视乎Android用户的数量)
(2)NDK将是Android平台支持C开发的开端。
NDK提供了的开发工具集合,使开发人员可以便捷地开发、发布C组件。同时,Google承诺在NDK后续版本中提高“可调式”能力,即提供远程的gdb工具,使我们可以便捷地调试C源码。在支持Android平台C开发,我们能感觉到Google花费了很大精力,我们有理由憧憬“C组件支持”只是Google Android平台上C开发的开端。毕竟,C程序员仍然是码农阵营中的绝对主力,将这部分人排除在Android应用开发之外,显然是不利于Android平台繁荣昌盛的。
自从ndk r5发布以后(7月13日,ndk r6发布),已经允许你完全用 C/C++ 来开发应用或者游戏,而不再需要编写任何 Java 的代码。
ok,早上就到这了,下午没事情的话继续进行进一步的学习。