【Android NDK 开发】JNI 方法解析 ( C/C++ 设置 Java 对象字段 | 查找字段 | 设置字段 )
文章目錄
- I . 設置 Java 對象 屬性 流程
- II . 查找 Java 對象屬性 ( GetFieldID )
- III . 設置 Java 對象屬性 ( SetXxxField )
I . 設置 Java 對象 屬性 流程
設置 Java 對象字段流程 :
① 獲取屬性 ID :
調用 jfieldID GetFieldID(jclass clazz, const char* name, const char* sig) 方法 , 獲取對象屬性 ID ;
② 根據屬性 ID 設置對象屬性 :
調用 void SetIntField(jobject obj, jfieldID fieldID, jint value) 方法 , 設置對象屬性 ;
II . 查找 Java 對象屬性 ( GetFieldID )
1 . 函數原型 : 通過 jclass 對象 , 屬性名稱名稱 , 和 類型簽名 , 獲取 Java 類對象對應的 屬性 ID ;
返回值 : Java 類對象 對應的 屬性 ID ( jfieldID 類型變量 )
參數 :
- jclass clazz : 要獲取的 Java 對象方法對應的 Java 類對象 ;
- const char* name : 屬性名稱 ;
- const char* sig : 類型簽名 ;
2 . 代碼示例 : 獲取 Student 類的 getAge 方法 ;
student_class 是 Student 類對應的 C/C++ 中的 jclass 類型變量 ;
“age” 是 屬性名稱 ;
“I” 是 屬性類型簽名 ;
涉及到的類型簽名可以參考 : https://hanshuliang.blog.csdn.net/article/details/104108556#V__javap_____141
III . 設置 Java 對象屬性 ( SetXxxField )
1 . 函數原型 : 通過 Java 對象 , 屬性 ID , 和 Java 數據類型屬性參數 , 設置對應的 Java 對象屬性 ;
返回值 : void
參數 :
- jobject obj : 要設置屬性的 Java 對象 ;
- jfieldID fieldID : 屬性 ID ;
- jint value : Java 的 int 類型屬性值 ;
2 . 設置方法匯總 :
設置 int 類型屬性 , 調用 void SetIntField(jobject obj, jfieldID fieldID, jint value) 方法 ;
設置 boolean 類型屬性 , 調用 void SetBooleanField(jobject obj, jfieldID fieldID, jboolean value) 方法 ;
下面是設置 8 種基本數據類型 和 引用類型 , 共 9 中類型應該調用的方法 ;
注意 : 所有設置的類型 , 都是 Java 數據類型 , 如 jobject , jint , jboolean 類型 ;
struct _JNIEnv {/* _JNIEnv 結構體中封裝了 JNINativeInterface 結構體指針 */const struct JNINativeInterface* functions;...// 最終 調用的 還是 JNINativeInterface 結構體中封裝的 SetXxxField 方法void SetObjectField(jobject obj, jfieldID fieldID, jobject value){ functions->SetObjectField(this, obj, fieldID, value); }void SetBooleanField(jobject obj, jfieldID fieldID, jboolean value){ functions->SetBooleanField(this, obj, fieldID, value); }void SetByteField(jobject obj, jfieldID fieldID, jbyte value){ functions->SetByteField(this, obj, fieldID, value); }void SetCharField(jobject obj, jfieldID fieldID, jchar value){ functions->SetCharField(this, obj, fieldID, value); }void SetShortField(jobject obj, jfieldID fieldID, jshort value){ functions->SetShortField(this, obj, fieldID, value); }void SetIntField(jobject obj, jfieldID fieldID, jint value){ functions->SetIntField(this, obj, fieldID, value); }void SetLongField(jobject obj, jfieldID fieldID, jlong value){ functions->SetLongField(this, obj, fieldID, value); }void SetFloatField(jobject obj, jfieldID fieldID, jfloat value){ functions->SetFloatField(this, obj, fieldID, value); }void SetDoubleField(jobject obj, jfieldID fieldID, jdouble value){ functions->SetDoubleField(this, obj, fieldID, value); }//設置靜態屬性jmethodID GetStaticMethodID(jclass clazz, const char* name, const char* sig){ return functions->GetStaticMethodID(this, clazz, name, sig); }... }
3 . 代碼示例 : 獲取 Student 類的 getAge 方法 ;
student 是 Student 類對應的 C/C++ 中的 Java 對象 ;
age_field_id 是 屬性 ID ;
90 是 屬性值 , jint 類型 ;
總結
以上是生活随笔為你收集整理的【Android NDK 开发】JNI 方法解析 ( C/C++ 设置 Java 对象字段 | 查找字段 | 设置字段 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android NDK 开发】JNI
- 下一篇: 【Android FFMPEG 开发】C