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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

jni java共享变量_Android JNI开发系列(十)JNI访问 Java 实例变量和静态变量

發布時間:2025/3/20 Android 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jni java共享变量_Android JNI开发系列(十)JNI访问 Java 实例变量和静态变量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JNI訪問 Java 實例變量和靜態變量

Java 中的實例變量和靜態變量,在本地代碼中如何來訪問和修改。靜態變量也稱為類變量(屬性),在所有實例對象中共享同一份數據,可以直接通過類名.變量名來訪問。實例變量也稱為成員變量(屬性),每個實例都擁有一份實例變量數據的拷貝,它們之間修改后的數據互不影響。

直接上代碼:

JAVA

public class Person {

//成員變量

private String hobby;

//靜態變量

private static int happiness;

public String getHobby() {

return hobby;

}

public static int getHappiness() {

return happiness;

}

//Native方法中設置成員變量的值

public native boolean setHobby();

//Native方法中設置靜態變量的值

public native boolean setHappiness();

}

Native

JNIEXPORT jboolean JNICALL

Java_org_professor_jni_bean_Person_setHobby(JNIEnv *env, jobject instance) {

//1.獲取類類型的Class對象

jclass personClass = (*env)->FindClass(env, "org/professor/jni/Person");

if (NULL == personClass) {

__android_log_print(ANDROID_LOG_ERROR, "PERSON", "NOT FIND CLASS");

return JNI_FALSE;

}

//2.獲取屬性ID

jfieldID hobbyFiledID = (*env)->GetFieldID(env, personClass, "hobby", "Ljava/long/String");

if (NULL == hobbyFiledID) {

__android_log_print(ANDROID_LOG_ERROR, "PERSON", "NOT FIND Hobby FiledID");

return JNI_FALSE;

}

//3.實例屬性,通過對象獲取屬性值

jstring hobbyFiledStr = (*env)->GetObjectField(env, instance, hobbyFiledID);

if (NULL != hobbyFiledStr) {

const char *hobby = (*env)->GetStringUTFChars(env, hobbyFiledStr, NULL);

if (NULL != hobby) {

__android_log_print(ANDROID_LOG_ERROR, "PERSON Hobby", hobby);

(*env)->ReleaseStringChars(env, hobbyFiledStr, hobby);

}

}

//4.設置屬性值

jstring jHobby = (*env)->NewStringUTF(env, "BASKETBALL,RUN");

(*env)->SetObjectField(env, instance, hobbyFiledID, jHobby);

//5.刪除局部引用變量

(*env)->DeleteLocalRef(env, personClass);

(*env)->DeleteLocalRef(env, hobbyFiledStr);

(*env)->DeleteLocalRef(env, jHobby);

return JNI_TRUE;

}

JNIEXPORT jboolean JNICALL

Java_org_professor_jni_bean_Person_setHappiness(JNIEnv *env, jobject instance) {

//1.獲取類類型的Class對象

jclass personClass = (*env)->FindClass(env, "org/professor/jni/Person");

if (NULL == personClass) {

__android_log_print(ANDROID_LOG_ERROR, "PERSON", "NOT FIND CLASS");

return JNI_FALSE;

}

//2.獲取屬性ID

jfieldID happinessFiledID = (*env)->GetStaticFieldID(env, personClass, "happiness", "I");

if (NULL == happinessFiledID) {

__android_log_print(ANDROID_LOG_ERROR, "PERSON", "NOT FIND Happiness FiledID");

return JNI_FALSE;

}

//3.獲取靜態屬性值

jint happinessValue = (*env)->GetStaticIntField(env, personClass, happinessFiledID);

if (NULL != happinessValue) {

__android_log_print(ANDROID_LOG_ERROR, "PERSON happinessValue = %d",

(const char *) happinessValue);

}

//4.設置靜態屬性值

(*env)->SetStaticIntField(env, personClass, happinessFiledID, 80);

//5.刪除本地局部引用表,基本數據類型不需要

(*env)->DeleteLocalRef(env, personClass);

return JNI_TRUE;

}

小結

由于JNI 函數是直接操作JVM中的數據結構,不受 Java訪問修飾符的限制。即,Native代碼中調用 JNI函數可以訪問 Java 對象中的非 public 屬性和方法

訪問和修改實例變量操作步聚:

調用 GetObjectClass 函數獲取實例對象的 Class 引用

調用 GetFieldID 函數獲取 Class 引用中某個實例變量的 ID

調用 GetXXXField 函數獲取變量的值,需要傳入實例變量所屬對象和變量 ID

調用 SetXXXField 函數修改變量的值,需要傳入實例變量所屬對象、變量 ID 和變量的值

訪問和修改靜態變量操作步聚:

調用 FindClass 函數獲取類的 Class 引用

調用 GetStaticFieldID 函數獲取 Class 引用中某個靜態變量 ID

調用 GetStaticXXXField 函數獲取靜態變量的值,需要傳入變量所屬 Class 的引用和變量 ID

調用 SetStaticXXXField 函數設置靜態變量的值,需要傳入變量所屬 Class 的引用、變量 ID和變量的值

總結

以上是生活随笔為你收集整理的jni java共享变量_Android JNI开发系列(十)JNI访问 Java 实例变量和静态变量的全部內容,希望文章能夠幫你解決所遇到的問題。

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