一、 静态方法java
通常使用javah进行编译,生成很长的文件名和函数名字,这个书写不方便,影响运行效率。函数
二、 动态注册工具
使用JNINativeMethod的结构,定义以下:指针
typedef struct {编译
const char* name; //java中函数的名字,不带包路径class
const char* signature ; //java函数的签名信息效率
void * fnPtr; //JNI层对应函数的函数指针变量
}JNINativeMethod;object
AndroidRunTime类提供了一个registerNativeMethods函数来完成注册工做。数据类型
当java经过System.loadLibrary加载完JNI动态库后,紧接着会查找库中一个叫作JNI_OnLoad的函数,若是有就调用它,而自动注册工做就在这里完成了。
一、 jfieldID 和 jmethodID 表示java类的成员变量和成员函数
jfieldID GetFieldID(jclass clazz, const char* name , const char *sig);
jmethodID GetMethodID(jclass clazz, const char* name, const char* sig);
其中 jclass表明java类
name表示成员函数或者变量名
sig这个为函数和变量的签名信息
若是每次操做jobject都去查询jmethodID或者jfieldID会影响程序的运行效率,因此咱们在初始化的时候将ID保存起来供后续使用。
二、使用jfieldID和jmethodID
代码以下:
经过JNIEnv输出CallVoidMethod的函数,以下:
其中type对应java函数的返回值类型,例如:CallIntMethod,CallVoidMethod等。
上面针对的是非static函数,若是想掉用java中的static函数,则JNIEnv输出CallStatic<type>Method系列函数。
经过jfieldID操做成员变量,以下:
Java支持函数重载,能够定义同名可是不一样参数的函数,但仅仅更具函数名是没法找到具体的函数,jni中将参数和返回值类型组合做为一个函数的签名信息,有了签名信息就能够找到java中的函数了。
虽然函数签名很容易写错,可是java提供了一个javap的工具,帮助函数或变量生成签名信息,用法以下:
javap –s -p XXX
其中XXX为编译后的class文件,s表示内部数据类型的签名信息,P表示打印全部的函数和成员的签名信息,默认只会打印public成员函数和函数的签名信息。