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的实体类

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