链接: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中获取,看是否修改成功
运行结果如下