鏈接: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中獲取,看是否修改成功
運行結果如下