?? Android Studio 版本 ????
??? Java 基礎(chǔ)類型數(shù)據(jù)對應(yīng) Native層的字母 ??
?通過 jni 查找java某個類中相應(yīng)字段對應(yīng)的數(shù)據(jù)類型 , 需要使用到 jni 中的 GetFieldID() 函數(shù)
jfieldID GetFieldID(jclass clazz, const char* name, const char* sig) { return functions->GetFieldID(this, clazz, name, sig); }
* |Java |JNI | * |boolean |Z | * |byte |B | * |char |C | * |short |S | * |int |I | * |long |J | * |float |F | * |double |D |
?? Java 引用類型數(shù)據(jù)對應(yīng) Native層字符串????
* |Java |JNI | * |String |Ljava/lang/String; | * |Class |Ljava/lang/Class; | * |Throwable |Ljava/lang/Throwable;| * |int[] |[I | * |Object[] |[Ljava/lang/Object; |
??? 創(chuàng)建 JNIAccessField 文件 ??
package com.cmake.ndk1.jni; import com.cmake.ndk1.model.Animal; public class JNIAccessField { static { System.loadLibrary("access-field-lib"); } public static int num; public native void accessInstanceField(Animal animal); }
?? 配置動態(tài)庫名稱 ???
add_library( #動態(tài)庫名稱 access-field-lib access-field-lib SHARED jni/jni_access_field.cpp )
?? 生成可關(guān)聯(lián)的庫鏈接 ???
為了讓Java能夠調(diào)用 access-field-lib 庫中的函數(shù),您需要使用 CMake 構(gòu)建腳本中的?target_link_libraries()?命令來關(guān)聯(lián) access-field-lib 庫
target_link_libraries( # Specifies the target library. ndk1 person-lib dynamic-lib basic-type-lib string-lib reference-type-lib access-field-lib # Links the target library to the log library # included in the NDK. ) )
??? 提供給 Native層調(diào)用的日志庫鏈接 ??
target_link_libraries( # Specifies the target library. access-field-lib # Links the target library to the log library # included in the NDK. ${log-lib})
??? Native層實現(xiàn) JNIAccessField 類的JNI的相關(guān)函數(shù)??
對Animal對象實例字段name的修改?
//對Animal對象實例字段name的修改 extern "C" JNIEXPORT void JNICALL Java_com_cmake_ndk1_jni_JNIAccessField_accessInstanceField(JNIEnv *env, jobject thiz, jobject animal) { jclass cls = env->GetObjectClass(animal); //獲取參數(shù)對象參數(shù)名字name jfieldID fid = env->GetFieldID(cls, "name", "Ljava/lang/String;"); //創(chuàng)建字符串用于對象中name字段的值 jstring str = env->NewStringUTF("this is new name"); //為Animal對象中name設(shè)置值 env->SetObjectField(animal, fid, str); }
?對Animal對象靜態(tài)字段num的修改
extern "C" JNIEXPORT void JNICALL Java_com_cmake_ndk1_jni_JNIAccessField_accessStaticField(JNIEnv *env, jobject thiz, jobject animal) { jclass cls = env->GetObjectClass(animal); //獲取參數(shù)對象參數(shù)名字num對應(yīng)的ID jfieldID fid = env->GetStaticFieldID(cls, "num", "I"); //獲取num的值 int num = env->GetStaticIntField(cls, fid); //修改num的值(++num) env->SetStaticIntField(cls, fid, ++num); }
此函數(shù)不會獲取jclass,進(jìn)而操作 num 的值
// 此函數(shù)不會獲取jclass,進(jìn)而操作 num 的值 extern "C" JNIEXPORT void JNICALL Java_com_cmake_ndk1_jni_JNIAccessField_staticAccessInstanceField(JNIEnv *env, jclass clazz) { //獲取參數(shù)對象參數(shù)名字num對應(yīng)的ID jfieldID fid = env->GetStaticFieldID(clazz, "num", "I"); //獲取num的值 int num = env->GetStaticIntField(clazz, fid); //修改num的值(++num) env->SetStaticIntField(clazz, fid, ++num); }
#include <jvm.h> #include <base.h> #include <string> #include <jni.h> /** * |Java |JNI | * |boolean |Z | * |byte |B | * |char |C | * |short |S | * |int |I | * |long |J | * |float |F | * |double |D | */ /** * |Java |JNI | * |String |Ljava/lang/String; | * |Class |Ljava/lang/Class; | * |Throwable |Ljava/lang/Throwable;| * |int[] |[I | * |Object[] |[Ljava/lang/Object; | */ //對Animal對象實例字段name的修改 extern "C" JNIEXPORT void JNICALL Java_com_cmake_ndk1_jni_JNIAccessField_accessInstanceField(JNIEnv *env, jobject thiz, jobject animal) { jclass cls = env->GetObjectClass(animal); //獲取參數(shù)對象參數(shù)名字name jfieldID fid = env->GetFieldID(cls, "name", "Ljava/lang/String;"); //創(chuàng)建字符串用于對象中name字段的值 jstring str = env->NewStringUTF("this is new name"); //為Animal對象中name設(shè)置值 env->SetObjectField(animal, fid, str); } //對Animal對象靜態(tài)字段num的修改 extern "C" JNIEXPORT void JNICALL Java_com_cmake_ndk1_jni_JNIAccessField_accessStaticField(JNIEnv *env, jobject thiz, jobject animal) { jclass cls = env->GetObjectClass(animal); //獲取參數(shù)對象參數(shù)名字num對應(yīng)的ID jfieldID fid = env->GetStaticFieldID(cls, "num", "I"); //獲取num的值 int num = env->GetStaticIntField(cls, fid); //修改num的值(++num) env->SetStaticIntField(cls, fid, ++num); } // 此函數(shù)不會獲取jclass,進(jìn)而操作 num 的值 extern "C" JNIEXPORT void JNICALL Java_com_cmake_ndk1_jni_JNIAccessField_staticAccessInstanceField(JNIEnv *env, jclass clazz) { //獲取參數(shù)對象參數(shù)名字num對應(yīng)的ID jfieldID fid = env->GetStaticFieldID(clazz, "num", "I"); //獲取num的值 int num = env->GetStaticIntField(clazz, fid); //修改num的值(++num) env->SetStaticIntField(clazz, fid, ++num); }
??? 調(diào)用Native層相關(guān)函數(shù)操作Animal ??
package com.cmake.ndk1; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import com.cmake.ndk1.jni.JNIAccessField; import com.cmake.ndk1.jni.JNIReferenceType; import com.cmake.ndk1.model.Animal; public class MainActivity6 extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); JNIAccessField jniAccessField=new JNIAccessField(); Animal animal=new Animal("animal"); final TextView textView=findViewById(R.id.sample_text); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { jniAccessField.accessInstanceField(animal); jniAccessField.accessStaticField(animal); JNIAccessField.staticAccessInstanceField(); Log.i("MainActivity6","name is "+animal.getName()); Log.i("MainActivity6","num is "+Animal.num); Log.i("MainActivity6","num is "+JNIAccessField.num); } }); } }
運(yùn)行結(jié)果 :??文章來源:http://www.zghlxwxcb.cn/news/detail-569195.html
D/Animal: call getName method I/MainActivity6: name is this is new name I/MainActivity6: num is 1 I/MainActivity6: num is 1 D/Animal: call getName method I/MainActivity6: name is this is new name I/MainActivity6: num is 2 I/MainActivity6: num is 2 D/Animal: call getName method I/MainActivity6: name is this is new name I/MainActivity6: num is 3 I/MainActivity6: num is 3
?下載案例文章來源地址http://www.zghlxwxcb.cn/news/detail-569195.html
到了這里,關(guān)于Android Java代碼與JNI交互 JNI方法Java類字段 (六)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!