jni操作jobject

一、 注册JNI函数

1、         静态方法

一般使用javah进行编译,生成很长的文件名和函数名字,这个书写不方便,影响运行效率。

2、         动态注册

使用JNINativeMethod的结构,定义如下:

typedef  struct {

   const char* name; //java中函数的名字,不带包路径

   const  char*  signature ;     //java函数的签名信息

   void *  fnPtr;    //JNI层对应函数的函数指针

}JNINativeMethod;

 

      AndroidRunTime类提供了一个registerNativeMethods函数来完成注册工作。

 

      当java通过System.loadLibrary加载完JNI动态库后,紧接着会查找库中一个叫做JNI_OnLoad的函数,如果有就调用它,而自动注册工作就在这里完成了。

 

 

 

二、通过JNIEnv操作jobject

1、 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保存起来供后续使用。

2、使用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成员函数和函数的签名信息。

 

posted @ 2016-11-28 16:11  winfu  阅读(3358)  评论(0编辑  收藏  举报