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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值