Android JNI學習07-AndroidStudio3.6 JNI函數調用java層實體類get,set 和 靜態方法,以及獲取和修改成員屬性

鏈接:https://pan.baidu.com/s/1zB9r5WwuTMIPNMlYl5HlvA 
提取碼:5ndl

本篇將實現的功能:

通過JNI函數調用java層實體類的get,set 和 靜態方法,以及獲取和修改成員屬性

先創建一個實體類

public class User {
    
    public String name;
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public static void printInfo(){
        System.out.println("這是User 實體 類");
    }
}

創建對應的native

實現native

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_jnistudy_MainActivity_parseUser(JNIEnv *env, jobject thiz, jobject user) {

}

在JNI中調用getName()

先獲取User對象的class

jclass beanCls = env->GetObjectClass(user);

通過class獲取對象的MethodID

jmethodID jniGetName = env->GetMethodID(beanCls, "getName", "()Ljava/lang/String;");

通過MethodId調用對應函數,獲取相應的返回值

jstring nameValue = static_cast<jstring>(env->CallObjectMethod(user, jniGetName));

將jstring轉化爲具體的char*,以便獲取字符串

const char* s = env->GetStringUTFChars(nameValue,NULL);
LOGE("getName()=:%s",s);

完整代碼如下

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_jnistudy_MainActivity_parseUser(JNIEnv *env, jobject thiz, jobject user) {
    jclass beanCls = env->GetObjectClass(user);
    jmethodID jniGetName = env->GetMethodID(beanCls, "getName", "()Ljava/lang/String;");
    jstring nameValue = static_cast<jstring>(env->CallObjectMethod(user, jniGetName));
    const char* s = env->GetStringUTFChars(nameValue,NULL);
    LOGE("getName()=:%s",s);
    std::string hello = "JNI 解析 實體類";
    return env->NewStringUTF(hello.c_str());
}

在MainActivity中,添加測試數據

運行結果如下

JNI調用setName

先獲取MethodId

jmethodID jniSetName = env->GetMethodID(beanCls, "setName", "(Ljava/lang/String;)V");

通過MethodId調用對應方法

jstring  nameStr = env->NewStringUTF("程序猿強哥");
env->CallVoidMethod(user,jniSetName,nameStr);

在MainActivity中添加測試代碼

運行結果如下

JNI調用靜態方法printInfo

先獲取MethodId

jmethodID  printInfo = env->GetStaticMethodID(beanCls,"printInfo","()V");

通過MethodId調用對應方法

env->CallStaticVoidMethod(beanCls,printInfo);

運行結果如下

JNI獲取成員屬性name

先獲取FieldId

jfieldID fid = env->GetFieldID( beanCls, "name", "Ljava/lang/String;");

通過FieldId獲取到具體的屬性值

jstring fieldNameStr = static_cast<jstring>(env->GetObjectField(user, fid));

將jstring轉化爲char* ,以便讀取

const char* cNameStr = env->GetStringUTFChars(fieldNameStr,NULL);
LOGE("屬性name=:%s",cNameStr);

運行結果如下

JNI修改成員屬性name

獲取FieldId

jfieldID  fileId = env->GetFieldID(beanCls,"name","Ljava/lang/String;");

通過FieldId設置屬性值

jstring  changeNameStr = env->NewStringUTF("修改屬性name");
env->SetObjectField(user,fileId,changeNameStr);

在MainActivity中獲取,看是否修改成功

運行結果如下

Android JNI學習08-AndroidStudio3.6 在JNI中創建java的實體類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章