JNI(Java Native Interface)

JNI Java本地接口,即C/C++(统称C)语言,为什么在Java程序设计中使用C语言?

  1. 调用Driver,调用操作系统驱动的C接口;
  2. 考虑运行效率,C的效率比Java高得多,对大量数据处理更适合;
  3. 重用已有C代码,对于已知的模块C已经实现,不需要再用Java实现;

在程序的角度,JNI就是实现Java访问C和C访问Java,从而进行Java和C的应用组合,Android Framework中就大量使用了JNI完成本地接口的实现。

  1. Java访问C:
    Java中声明native函数,具体实现在C中,编译时Java编译器也不会关心native函数的实现;运行时会先加载C所生成的动态库,再调用native方法,否则会报找不到相应native错。
    Java中声明的函数名称和C中实现的函数名称是不同的,后者等于包名加前者的名称,并且中间以下划线分隔。eg:
    Java:private native final void init();
    C 中:static void anroid_content_AssentManager_init(JNIEnv* env, jobject clazz);
    这是一种编程规范,Java调用native时,编译器会向native引擎传递调用者的包名函数名参数类型,native引擎根据这些信息决定调用哪个native函数。同时native引擎中AndroidRuntime类提供了registerNativeMethods()来定义Java native函数和C函数名称的映射关系。
    C函数中至少包含两个参数(JNIEnv对象和jobject)。JNIEnv是Java虚拟机(JVM)运行的环境,通过它可以访问JVM内部的各种对象;jobject则是调用改函数的对象;若native函数本身也有参数,则依次放在这两个参数后面。
    同样,Java代码不能直接访问C中的变量,因为C中的变量对于Java都是私有的,只能通过C提供get()/set()间接访问。

  2. C访问Java:
    C访问Java不能通过函数指针,只能通过通用的参数接口,正如Java调用C一样,需要把想要访问的类名,函数名和参数传递给Java引擎,由Java引擎去执行。
    步骤为:获取Java对象的类 —> 获取Java函数的id值 —> 调用该函数
    其中,C调用Java函数只能在Java调用C函数中进行,因此C访问Java的原则就是“你不惹我,我不惹你”。
    同样,C访问Java中的变量步骤为:获取Java对象的类—>获取变量的id值—>获取变量值。

你可能感兴趣的:(Android系统开发)