您的位置:首页 > 其它

JNI中参数的传递与操作(下)

2012-02-23 20:47 399 查看
文章参自:http://wenku.baidu.com/view/0b78684669eae009581bec73.html
http://wenku.baidu.com/view/3114e862caaedd3383c4d396.html
http://blog.csdn.net/limx59/archive/2010/09/27/5908895.aspx
四、对象的传递和操作

JNI中,C函数名的java对象参数,除了String类外则都表示为jobject类型(String类表示为jstring类型).
JNI提供了在本地代码中操作Java对象的功能。
基本原理
首先需要找到对象属于哪个类(class).类(class)在JNI中用jclass进行表示。
查找java类有两种方式:
一、用类名(如android.os.Binder)在FindClass()函数中查找得到jclass对象。
比如:jclass clazz = env->FindClass(kBinderPathName) ;
这里的kBinderPathName为"android.os.Binder",所以上面等同于jclass clazz= env->FindClass("android.os.Binder");
二、可以通过jclass GetObjectClass (jobject
obj0)方法得到一个jclass,以表示obj0对象属于哪个类.
比如:jclass clazz=env->GetObjectClass (obj);
然后对Field和函数再分别按下面的两种方式进行处理。
成员变量:通过GetFieldID/GetStaticFieldID得Field的id(以jfieldID形式表示),然后调用GetXXXField/GetStaticXXXField函数就可以到Field的值,
调用SetXXXField/SetStaticXXXField就可以设置Field的值。
函数:和操作Field类似,通过GetMethodID/GetStaticMethodID得到函数的id(以jmethodID形式表示),然后就可以通过CallXXXMethod/CallStaticXXXMethod进行函数调用了.
GetFieldID/GetStaticFieldID简介

jfieldID GetFieldID (jclass cl0, const char * val1, const char * val2)
jfieldID GetStaticFieldID (jclass cl0, const char * val1, const char * val2)
前者用于非静态Field,后者用于静态Field
第一个参数,jcalss cl0用于表示在哪个类上进行操作。
第二个参数,const char * val对应函数的名字
第三个参数,const char * val2用于表示Field是什么类型.
关于java参数类型的符号化表示请参考《JNI中java类型的符号化表示
GetXXXField/GetStaticXXXField简介
GetXXXField/GetStaticXXXField中的XXX表示对什么类型的Field进行操作。前者用于非静态Field,后者用于静态Field。
该系列函数包括:
非静态

jobject GetObjectField (jobject obj0, jfieldID fld1)
jboolean GetBooleanField (jobject obj0, jfieldID fld1)
jbyte GetByteField (jobject obj0, jfieldID fld1)
jchar GetCharField (jobject obj0, jfieldID fld1)
jshort GetShortField (jobject obj0, jfieldID fld1)
jint GetIntField (jobject obj0, jfieldID
fld1)
jlong GetLongField (jobject obj0, jfieldID fld1)
jfloat GetFloatField (jobject obj0, jfieldID fld1)
jdouble GetDoubleField (jobject obj0, jfieldID fld1)

静态

jobject GetStaticObjectField (jclass cl0, jfieldID fld1)
jboolean GetStaticBooleanField (jclass cl0, jfieldID fld1)
jbyte GetStaticByteField (jclass cl0, jfieldID fld1)
jchar GetStaticCharField (jclass cl0, jfieldID fld1)
jshort GetStaticShortField (jclass cl0, jfieldID fld1)
jint GetStaticIntField (jclass cl0, jfieldID fld1)
jlong GetStaticLongField (jclass cl0, jfieldID fld1)
jfloat GetStaticFloatField (jclass cl0, jfieldID fld1)
jdouble GetStaticDoubleField (jclass cl0, jfieldID fld1)
第一个参数,jcalss cl0用于表示在哪个类上进行操作。
第二个参数,表示GetFieldID/GetStaticFieldID中得到的Field的id

SetXXXField/SetStaticXXXField简介
SetXXXField/SetStaticXXXField中的XXX表示对什么类型的Field进行操作。前者用于非静态Field,后者用于静态Field。

该系列函数包括:
非静态

void SetObjectField (jobject obj0, jfieldID fld1, jobject obj2)
void SetBooleanField (jobject obj0, jfieldID fld1, jboolean val2)
void SetByteField (jobject obj0, jfieldID fld1, jbyte val2)
void SetCharField (jobject obj0, jfieldID fld1, jchar val2)
void SetShortField (jobject obj0, jfieldID fld1, jshort val2)
void SetIntField (jobject obj0, jfieldID fld1, jint val2)
void SetLongField (jobject obj0, jfieldID fld1, jlong val2)
void SetFloatField (jobject obj0, jfieldID fld1, jfloat val2)
void SetDoubleField (jobject obj0, jfieldID fld1, jdouble val2)

静态

void SetStaticObjectField (jclass cl0, jfieldID fld1, jobject obj2)
void SetStaticBooleanField (jclass cl0, jfieldID fld1, jboolean val2)
void SetStaticByteField (jclass cl0, jfieldID fld1, jbyte val2)
void SetStaticCharField (jclass cl0, jfieldID fld1, jchar val2)
void SetStaticShortField (jclass cl0, jfieldID fld1, jshort val2)
void SetStaticIntField (jclass cl0, jfieldID fld1, jint val2)
void SetStaticLongField (jclass cl0, jfieldID fld1, jlong val2)
void SetStaticFloatField (jclass cl0, jfieldID fld1, jfloat val2)
void SetStaticDoubleField (jclass cl0, jfieldID fld1, jdouble val2)

第一个参数,jcalss cl0用于表示在哪个类上进行操作。
第二个参数,表示GetFieldID/GetStaticFieldID中得到的Field的id
第三个参数,表示新值

GetMethodID/GetStaticMethodID简介

jmethodID GetMethodID (jclass cl0, const char * val1, const char * val2)
jmethodID GetStaticMethodID (jclass cl0, const char * val1, const char * val2)
调用他们能得到函数的id(以jmethodID形式表示).前者用于非静态Field,后者用于静态Field

第一个参数,jcalss cl0用于表示在哪个类上进行操作。
第二个参数,const char * val对应函数的名字
第三个参数,const char * val2用于表示函数的传入参数都有哪些,都是些什么类型,返回参数是什么类型。因为函数可以重载,所以必须要该参数才能定为函数。这里是以符号的形式表示传入参数的类型。
关于java参数类型的符号化表示请参考《JNI中java类型的符号化表示

CallXXXMethod/CallStaticXXXMethod
CallXXXMethod/CallStaticXXXMethod中的XXX表示对什么返回类型的Field函数进行调用。前者用于非静态函数的调用,后者用于静态函数的调用。

该系列函数包括:
非静态

jobject CallObjectMethod (jobject obj0, jmethodID meth1, ...)
jboolean CallBooleanMethod (jobject obj0, jmethodID meth1, ...)
jbyte CallByteMethod (jobject obj0, jmethodID meth1, ...)
jchar CallCharMethod (jobject obj0, jmethodID meth1, ...)
jshort CallShortMethod (jobject obj0, jmethodID meth1, ...)
jint CallIntMethod (jobject obj0, jmethodID meth1, ...)
jlong CallLongMethod (jobject obj0, jmethodID meth1, ...)
jfloat CallFloatMethod (jobject obj0, jmethodID meth1, ...)
jdouble CallDoubleMethod (jobject obj0, jmethodID meth1, ...)
void CallVoidMethod (jobject obj0, jmethodID meth1, ...)

静态

jobject CallStaticObjectMethod (jclass cl0, jmethodID meth1, ...)
jboolean CallStaticBooleanMethod (jclass cl0, jmethodID meth1, ...)
jbyte CallStaticByteMethod (jclass cl0, jmethodID meth1, ...)
jchar CallStaticCharMethod (jclass cl0, jmethodID meth1, ...)
jshort CallStaticShortMethod (jclass cl0, jmethodID meth1, ...)
jint CallStaticIntMethod (jclass cl0, jmethodID meth1, ...)
jlong CallStaticLongMethod (jclass cl0, jmethodID meth1, ...)
jfloat CallStaticFloatMethod (jclass cl0, jmethodID meth1, ...)
jdouble CallStaticDoubleMethod (jclass cl0, jmethodID meth1, ...)
void CallStaticVoidMethod (jclass cl0, jmethodID meth1, ...)

第一个参数,jobject
obj0表示调用哪个对象的非静态函数;jcalss cl0表示调用哪个类的静态函数。
第二个参数,jmethodID
meth1表示调用函数的id(以jmethodID形式进行表示)
第三个及以后的参数,他们是调用的java函数的传入参数
如何返回一个新的JAVA对象呢?

通过NewObject函数创建一个java对象,然后像操作一般的对象一样操作它,最后返回该对象就可以了。
jobject NewObject (jclass cl0, jmethodID meth1, ...)
第一个参数,jclass cl0表示创建哪个类的实例。
第二个参数,jmethodID meth1表示用哪个构造函数创建该类的实例。
可用如下的方法得到构造函数的Id:

jclass strClass = env->FindClass("Ljava/lang/String;");
jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: