日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【Android NDK 开发】JNI 方法解析 ( C/C++ 设置 Java 对象字段 | 查找字段 | 设置字段 )

發布時間:2025/6/17 c/c++ 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 : 類型簽名 ;
struct _JNIEnv {/* _JNIEnv 結構體中封裝了 JNINativeInterface 結構體指針 */const struct JNINativeInterface* functions;...// 最終 調用的 還是 JNINativeInterface 結構體中封裝的 GetFieldID 方法jfieldID GetFieldID(jclass clazz, const char* name, const char* sig){ return functions->GetFieldID(this, clazz, name, sig); }... }

2 . 代碼示例 : 獲取 Student 類的 getAge 方法 ;

student_class 是 Student 類對應的 C/C++ 中的 jclass 類型變量 ;
“age” 是 屬性名稱 ;
“I” 是 屬性類型簽名 ;

extern "C" JNIEXPORT void JNICALL Java_kim_hsl_jni_MainActivity_jniObjectTest(JNIEnv *env, jobject instance, jobject student) {...//1 . 獲取 Java 對應的 Class 對象jclass student_class = env->GetObjectClass(student);//2 . 獲取 Student 的 private int age 屬性jfieldID age_field_id = env->GetFieldID(student_class, "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 類型屬性值 ;
struct _JNIEnv {/* _JNIEnv 結構體中封裝了 JNINativeInterface 結構體指針 */const struct JNINativeInterface* functions;...// 最終 調用的 還是 JNINativeInterface 結構體中封裝的 SetIntField 方法void SetIntField(jobject obj, jfieldID fieldID, jint value){ functions->SetIntField(this, obj, fieldID, value); }... }

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 類型 ;

extern "C" JNIEXPORT void JNICALL Java_kim_hsl_jni_MainActivity_jniObjectTest(JNIEnv *env, jobject instance, jobject student) {...//1 . 獲取 Java 對應的 Class 對象jclass student_class = env->GetObjectClass(student);//2 . 獲取 Student 的 private int age 屬性jfieldID age_field_id = env->GetFieldID(student_class, "age", "I");//3 . 設置 Student 的 age 屬性值 90env->SetIntField(student, age_field_id, 90);... }

總結

以上是生活随笔為你收集整理的【Android NDK 开发】JNI 方法解析 ( C/C++ 设置 Java 对象字段 | 查找字段 | 设置字段 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。