Java Android JNI为什么父类中的setChild()不可用
调用testInterface()时,setName()正常,但setChild()如下所示:Java Android JNI为什么父类中的setChild()不可用,java,android,java-native-interface,Java,Android,Java Native Interface,调用testInterface()时,setName()正常,但setChild()如下所示: E/AndroidRuntime(18708): java.lang.NoSuchMethodError: no non-static method "Lcom/***/TestParent;.setChild(Ljava/lang/Object;)V" JNI JNIEXPORT jobject JNICALL Java_***_testInterface( JNIEnv * en
E/AndroidRuntime(18708): java.lang.NoSuchMethodError: no non-static method "Lcom/***/TestParent;.setChild(Ljava/lang/Object;)V"
JNI
JNIEXPORT jobject JNICALL Java_***_testInterface(
JNIEnv * env, jobject thiz) {
jclass parent_cls = env->FindClass("com/wkn/muscle/activity/TestParent");
LOGD("testInterface 0");
jmethodID parent_mid = env->GetMethodID(parent_cls, "<init>", "()V");
LOGD("testInterface 1");
jobject parent_obj = env->NewObject(parent_cls, parent_mid);
LOGD("testInterface 2");
jstring str_parent = env->NewStringUTF("Parent_from_Native");
LOGD("testInterface 3");
jmethodID parent_set_name = env->GetMethodID(parent_cls, "setName",
"(Ljava/lang/String;)V");
LOGD("testInterface 4");
env->CallVoidMethod(parent_obj, parent_set_name, str_parent);
LOGD("testInterface 5");
jclass child_cls = env->FindClass("com/wkn/muscle/activity/TestChild");
LOGD("testInterface 6");
jmethodID child_mid = env->GetMethodID(child_cls, "<init>", "()V");
LOGD("testInterface 7");
jobject child_obj = env->NewObject(child_cls, child_mid);
LOGD("testInterface 8");
jstring str_child = env->NewStringUTF("Child_from_Native");
LOGD("testInterface 9");
jmethodID child_set_name = env->GetMethodID(child_cls, "setName",
"(Ljava/lang/String;)V");
LOGD("testInterface 10");
env->CallVoidMethod(child_obj, child_set_name, str_child);
LOGD("testInterface 11");
jmethodID parent_set_child = env->GetMethodID(parent_cls, "setChild",
"(Ljava/lang/Object;)V");
LOGD("testInterface 12");
env->CallVoidMethod(parent_obj, parent_set_child, child_obj);
LOGD("testInterface 13");
return parent_obj;
}
void JNICALL Java_***_testInterface2(JNIEnv * env, jobject thiz, jobject parent_obj, jobject child_obj) {
jclass parent_cls = env->GetObjectClass(parent_obj);
jstring str_parent = env->NewStringUTF("Parent_from_Native");
jmethodID parent_set_name = env->GetMethodID(parent_cls, "setName", "(Ljava/lang/String;)V");
env->CallVoidMethod(parent_obj, parent_set_name, str_parent);
jclass child_cls = env->GetObjectClass(child_obj);
jstring str_child = env->NewStringUTF("Child_from_Native");
jmethodID child_set_name = env->GetMethodID(child_cls, "setName",
"(Ljava/lang/String;)V");
env->CallVoidMethod(child_obj, child_set_name, str_child);
}
最后,以另一种方式实现此功能: Java
TestParent parent = new TestParent();
TestChild child = new TestChild();
parent.setChild(child);
testInterface2(parent, child);
JNI
JNIEXPORT jobject JNICALL Java_***_testInterface(
JNIEnv * env, jobject thiz) {
jclass parent_cls = env->FindClass("com/wkn/muscle/activity/TestParent");
LOGD("testInterface 0");
jmethodID parent_mid = env->GetMethodID(parent_cls, "<init>", "()V");
LOGD("testInterface 1");
jobject parent_obj = env->NewObject(parent_cls, parent_mid);
LOGD("testInterface 2");
jstring str_parent = env->NewStringUTF("Parent_from_Native");
LOGD("testInterface 3");
jmethodID parent_set_name = env->GetMethodID(parent_cls, "setName",
"(Ljava/lang/String;)V");
LOGD("testInterface 4");
env->CallVoidMethod(parent_obj, parent_set_name, str_parent);
LOGD("testInterface 5");
jclass child_cls = env->FindClass("com/wkn/muscle/activity/TestChild");
LOGD("testInterface 6");
jmethodID child_mid = env->GetMethodID(child_cls, "<init>", "()V");
LOGD("testInterface 7");
jobject child_obj = env->NewObject(child_cls, child_mid);
LOGD("testInterface 8");
jstring str_child = env->NewStringUTF("Child_from_Native");
LOGD("testInterface 9");
jmethodID child_set_name = env->GetMethodID(child_cls, "setName",
"(Ljava/lang/String;)V");
LOGD("testInterface 10");
env->CallVoidMethod(child_obj, child_set_name, str_child);
LOGD("testInterface 11");
jmethodID parent_set_child = env->GetMethodID(parent_cls, "setChild",
"(Ljava/lang/Object;)V");
LOGD("testInterface 12");
env->CallVoidMethod(parent_obj, parent_set_child, child_obj);
LOGD("testInterface 13");
return parent_obj;
}
void JNICALL Java_***_testInterface2(JNIEnv * env, jobject thiz, jobject parent_obj, jobject child_obj) {
jclass parent_cls = env->GetObjectClass(parent_obj);
jstring str_parent = env->NewStringUTF("Parent_from_Native");
jmethodID parent_set_name = env->GetMethodID(parent_cls, "setName", "(Ljava/lang/String;)V");
env->CallVoidMethod(parent_obj, parent_set_name, str_parent);
jclass child_cls = env->GetObjectClass(child_obj);
jstring str_child = env->NewStringUTF("Child_from_Native");
jmethodID child_set_name = env->GetMethodID(child_cls, "setName",
"(Ljava/lang/String;)V");
env->CallVoidMethod(child_obj, child_set_name, str_child);
}
最后,以另一种方式实现此功能: Java
TestParent parent = new TestParent();
TestChild child = new TestChild();
parent.setChild(child);
testInterface2(parent, child);
JNI
JNIEXPORT jobject JNICALL Java_***_testInterface(
JNIEnv * env, jobject thiz) {
jclass parent_cls = env->FindClass("com/wkn/muscle/activity/TestParent");
LOGD("testInterface 0");
jmethodID parent_mid = env->GetMethodID(parent_cls, "<init>", "()V");
LOGD("testInterface 1");
jobject parent_obj = env->NewObject(parent_cls, parent_mid);
LOGD("testInterface 2");
jstring str_parent = env->NewStringUTF("Parent_from_Native");
LOGD("testInterface 3");
jmethodID parent_set_name = env->GetMethodID(parent_cls, "setName",
"(Ljava/lang/String;)V");
LOGD("testInterface 4");
env->CallVoidMethod(parent_obj, parent_set_name, str_parent);
LOGD("testInterface 5");
jclass child_cls = env->FindClass("com/wkn/muscle/activity/TestChild");
LOGD("testInterface 6");
jmethodID child_mid = env->GetMethodID(child_cls, "<init>", "()V");
LOGD("testInterface 7");
jobject child_obj = env->NewObject(child_cls, child_mid);
LOGD("testInterface 8");
jstring str_child = env->NewStringUTF("Child_from_Native");
LOGD("testInterface 9");
jmethodID child_set_name = env->GetMethodID(child_cls, "setName",
"(Ljava/lang/String;)V");
LOGD("testInterface 10");
env->CallVoidMethod(child_obj, child_set_name, str_child);
LOGD("testInterface 11");
jmethodID parent_set_child = env->GetMethodID(parent_cls, "setChild",
"(Ljava/lang/Object;)V");
LOGD("testInterface 12");
env->CallVoidMethod(parent_obj, parent_set_child, child_obj);
LOGD("testInterface 13");
return parent_obj;
}
void JNICALL Java_***_testInterface2(JNIEnv * env, jobject thiz, jobject parent_obj, jobject child_obj) {
jclass parent_cls = env->GetObjectClass(parent_obj);
jstring str_parent = env->NewStringUTF("Parent_from_Native");
jmethodID parent_set_name = env->GetMethodID(parent_cls, "setName", "(Ljava/lang/String;)V");
env->CallVoidMethod(parent_obj, parent_set_name, str_parent);
jclass child_cls = env->GetObjectClass(child_obj);
jstring str_child = env->NewStringUTF("Child_from_Native");
jmethodID child_set_name = env->GetMethodID(child_cls, "setName",
"(Ljava/lang/String;)V");
env->CallVoidMethod(child_obj, child_set_name, str_child);
}