Bootstrap

深入Android架构(从线程到AIDL)_33 JNI开发与NDK 01

1、 JNI基本概念

  • 在Androd框架里,上层是Java框架,而下层是C/C++框架。这两层框架之间会有密切的沟通。此时JNI(Java Native Interface)就扮演双方沟通的接口了。
  • 藉由JNI接口,可将Java层的基类或子类的函数实作部份挖空,而移到JNI层的C函数来实作之。例如,原来在Java层有个完整的Java类:
  • 这是一个完整的Java类,其add()函数里有完整的实作(Implement)代码。如果从这Java类里移除掉add()函数里的实作代码(就如同抽象类里的抽象函数一般),而成为本地(Native)函数;然后依循JNI接口协议而以C语言来实作之。如下图所示:

         

  • 这个add()函数仍然是Java类的一部分,只是它是用C语言来实作而已。为什么要将Java类的add()函数挖空呢? 其主要的理由是: Java代码执行速度较慢,而C代码执行速度快。然而Java代码可以跨平台,而C代码与本地平台设备息息相关,所以称之为本地(Native)代码。
  • 在本地的C代码里,可以创建C++类的对象,并调用其函数。如下图:

         

       

  • 藉由JNI接口,就能让Java类与C++类互相沟通起来了。这也是Android双层框架的重要基础机制。如下图所示:
  • 从上述各图看来,只看到上层的Java函数调用中间JNI层的C函数,再往下调用C++层的函数。然而,在Android 环境里,从C/C++层函数反过来调用Java层函数,反而是更关键性的机制。
  • 所以,我们更需要关注于从C/C++层调用Java层函数的方法和技术。

         

      

;