1. 程式人生 > >JNI中參數的傳遞與操作 下

JNI中參數的傳遞與操作 下

env pan net java類 分享 rtm roi short cin

文章參自: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");

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net

JNI中參數的傳遞與操作 下