Android JNI为什么ParentClass中的setChild()不可用

时间:2016-11-04 08:11:04

标签: java android java-native-interface

当我调用testInterface()时,setName()是OK,但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 * 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;
}

爪哇:

public class TestParent {

    private TestChild child;

    public TestParent(){

    }

    public String getName(){
        return this.name;
    }

    public void setName(String name){
        this.name = name;
    }

    public TestChild getChild(){
        return this.child;
    }

    public void setChild(TestChild child){
        this.child = child;
    }
}

public class TestChild {

    private String name;

    public TestChild(){
    }

    public String getName(){
        return this.name;
    }

    public void setName(String name){
        this.name = name;
    }
}

1 个答案:

答案 0 :(得分:0)

最后,以另一种方式实现此功能:

<强>爪哇

TestParent parent = new TestParent();
TestChild child = new TestChild();
parent.setChild(child);
testInterface2(parent, child);

<强> JNI

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);
}