JNI存在原因:调用驱动(java不具备操作驱动的能力);大数据处理模块(C的效率高);某些功能模块C已经实现。
当调用native函数时,java会自动产生一个对应的C中的函数名称。其关系为,包名+名称,并且中间以下画线分割(这个并不是java编译器内含的,是一种编程规范);native引擎中AndroidRuntime类提供了一个registerNativeMethods函数,可以定义映射关系。
在产生的C函数中,包含两个参数,JNIEnv对象是Java虚拟机所运行的环境,相当于JVM的管家,通过它可以访问JVM内部的各种对象;jobject是调用该函数的对象。Java代码中不能直接访问C中的变量,C中的变量对于java是私有的,让C提供get和set方法。
C访问java,类似于反射机制调用类中的方法。
在C中使用持久对象:private int mObject,使用的时候强制转换成本地对象。