jni操做jobject

1、 注册JNI函数

一、         静态方法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的函数,若是有就调用它,而自动注册工做就在这里完成了。

 

 

 

2、经过JNIEnv操做jobject

一、 jfieldIDjmethodID 表示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操做成员变量,以下:

 

 

3、函数签名

    Java支持函数重载,能够定义同名可是不一样参数的函数,但仅仅更具函数名是没法找到具体的函数,jni中将参数和返回值类型组合做为一个函数的签名信息,有了签名信息就能够找到java中的函数了。

 

 

虽然函数签名很容易写错,可是java提供了一个javap的工具,帮助函数或变量生成签名信息,用法以下:

javap –s  -p XXX

其中XXX为编译后的class文件,s表示内部数据类型的签名信息,P表示打印全部的函数和成员的签名信息,默认只会打印public成员函数和函数的签名信息。

相关文章
相关标签/搜索