1、ndk层修改java层的对象的属性
package com.yuanxuzhen.testnative;
public class UserData {
public String name;
public String sex;
public int age;
public UserData(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public UserData(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "UserData{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
public native UserData callNativeUserData(UserData data);
JNIEXPORT jobject JNICALL
Java_com_yuanxuzhen_testnative_MainActivity_callNativeUserData(JNIEnv *env, jobject thiz,
jobject data) {
// TODO: implement callNativeUserData()
jclass cls = (*env)->GetObjectClass(env, data);
jfieldID jfieldId = (*env)->GetFieldID(env, cls, "name", "Ljava/lang/String;");
jstring jstring1 = ((*env)->GetObjectField(env, data, jfieldId));
const char* c = (*env)->GetStringUTFChars(env,jstring1, 0);
LOGE("native name = %s", c );
(*env)->ReleaseStringUTFChars(env,jstring1, c);
jstring jstring2 = (*env)->NewStringUTF(env,"yuanping");
(*env)->SetObjectField(env,data, jfieldId, jstring2);
return data;
}
2、ndk层访问java层的静态方法
public static void testStaticJniCallJava(String name){
Log.e("xxxx", "testJniCallJava name="+name);
}
public native void jniCallJava();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
jniCallJava();
}
JNIEXPORT void JNICALL
Java_com_yuanxuzhen_testnative_MainActivity_jniCallJava(JNIEnv *env, jobject thiz) {
jclass cls = (*env)->GetObjectClass(env, thiz);
jmethodID jmethodId = (*env)->GetStaticMethodID(env, cls, "testStaticJniCallJava", "(Ljava/lang/String;)V");
(*env)->CallStaticVoidMethod(cls, jmethodId, (*env)->NewStringUTF(env,"yuanjingyao"));
}
thiz代表调用的对象
3、ndk层调用对象的方法
public native void callInterface(ITest test);
//extern "C"
JNIEXPORT void JNICALL
Java_com_yuanxuzhen_testnative_MainActivity_callInterface(JNIEnv *env, jobject thiz, jobject test) {
LOGE("callInterface 1111111");
jclass cls = (*env)->GetObjectClass(env, test);
jmethodID methodId = (*env)->GetMethodID(env,cls, "printUserData",
"(Lcom/yuanxuzhen/testnative/UserData;)V");
jstring name = (*env)->NewStringUTF(env,getYuanxzh());
jstring sex = (*env)->NewStringUTF(env, "female");
jint age = 2;
jclass userDataClass = (*env)->FindClass(env,"com/yuanxuzhen/testnative/UserData");
jmethodID useGenId = (*env)->GetMethodID(env,userDataClass, "<init>",
"(Ljava/lang/String;Ljava/lang/String;I)V");
jobject useObject = (*env)->NewObject(env,userDataClass, useGenId, name, sex, age);
(*env)->CallVoidMethod(env,test, methodId, useObject);
LOGE("callInterface 222222");
}
4、ndk层创建java层对象
jclass userDataClass = (*env)->FindClass(env,"com/yuanxuzhen/testnative/UserData");
jmethodID useGenId = (*env)->GetMethodID(env,userDataClass, "<init>",
"(Ljava/lang/String;Ljava/lang/String;I)V");
jobject useObject = (*env)->NewObject(env,userDataClass, useGenId, name, sex, age);
(*env)->CallVoidMethod(env,test, methodId, useObject);
5 ndk 层方法调用java接口
public interface ITest {
void printUserData(UserData data);
}
public native void callInterface(ITest test);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.sampleText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
callInterface(new ITest() {
@Override
public void printUserData(UserData data) {
Log.e("xxxx", "printUserData data = " + data);
}
});
}
});
}
Java_com_yuanxuzhen_testnative_MainActivity_callInterface(JNIEnv *env, jobject thiz, jobject test) {
LOGE("callInterface 1111111");
jclass cls = (*env)->GetObjectClass(env, test);
jmethodID methodId = (*env)->GetMethodID(env,cls, "printUserData",
"(Lcom/yuanxuzhen/testnative/UserData;)V");
jstring name = (*env)->NewStringUTF(env,getYuanxzh());
jstring sex = (*env)->NewStringUTF(env, "female");
jint age = 2;
jclass userDataClass = (*env)->FindClass(env,"com/yuanxuzhen/testnative/UserData");
jmethodID useGenId = (*env)->GetMethodID(env,userDataClass, "<init>",
"(Ljava/lang/String;Ljava/lang/String;I)V");
jobject useObject = (*env)->NewObject(env,userDataClass, useGenId, name, sex, age);
(*env)->CallVoidMethod(env,test, methodId, useObject);
LOGE("callInterface 222222");
}
从上面可以知道java层的接口到了ndk层就成了对象
6、ndk层调用java的构造函数
jclass userDataClass = (*env)->FindClass(env,"com/yuanxuzhen/testnative/UserData");
jmethodID useGenId = (*env)->GetMethodID(env,userDataClass, "<init>",
"(Ljava/lang/String;Ljava/lang/String;I)V");
jobject useObject = (*env)->NewObject(env,userDataClass, useGenId, name, sex, age);