JNI NoSuchMethodException: тип параметра является нулем - PullRequest
0 голосов
/ 22 февраля 2012

Я работаю над вызовом метода экземпляра, используя JNI в Android.Весь код компилируется, но для защиты содержимого проекта я покажу только соответствующие части кода.Следующий блок кода (extern c используется в файле c ++ ) пытается получить доступ к статическому методу [public String getMyString()] в cls .Я знаю, что cls и env не равны нулю. mid не равно нулю и не null .Когда этот собственный метод возвращается на сторону Java, я получаю следующую ошибку (восходит к Class.java ):

02-22 10:38:36.010: E/AndroidRuntime(17894): FATAL EXCEPTION: GLThread 10
02-22 10:38:36.010: E/AndroidRuntime(17894): java.lang.NoSuchMethodException: parameter type is null
02-22 10:38:36.010: E/AndroidRuntime(17894):    at java.lang.ClassMembers.getConstructorOrMethod(ClassMembers.java:228)
02-22 10:38:36.010: E/AndroidRuntime(17894):    at java.lang.Class.getMethod(Class.java:904)
02-22 10:38:36.010: E/AndroidRuntime(17894):    at com.example.android.MyClass.getMyString(Native Method)
02-22 10:38:36.010: ...

Код, который генерирует ошибку, выглядит следующим образом:

    jmethodID mid = env->GetMethodID(cls, "getMyString", "()Ljava/lang/String;");
    if (mid == 0) {
        __android_log_write(ANDROID_LOG_INFO, "JNI", "mid is 0");
    }
    else {
        __android_log_write(ANDROID_LOG_INFO, "JNI", "mid is not 0");
    }
    jstr = (jstring) env->CallObjectMethod(obj, mid);
    if (jstr == NULL) {
        __android_log_write(ANDROID_LOG_INFO, "JNI", "jstr is NULL");
    }
    else {
        __android_log_write(ANDROID_LOG_INFO, "JNI", "jstr is not NULL");
    }

    printf("  c.s = \"%s\"\n", env->GetStringUTFChars(jstr, NULL));

    return jstr;

Хотя Class.java, кажется, предполагает, что это проблема с приведением от null до Class<?>[] (обычное для отражения), у меня есть ощущение, что оно имеет большее отношение к mid обнаружение неправильного метода или jstr , возвращающегося некорректно (logcat утверждает, что jstr НЕ является нулевым).

Наконец, сторона Javaсоответствующий код выглядит следующим образом:

Собственный вызов:

public static native String getMyNativeString();

Вызов собственного метода:

String myStr = callGetMyNativeString();

Метод, к которому осуществляется доступ:

public String getMyString() {
    return "Foobar";
}

1 Ответ

0 голосов
/ 23 февраля 2012

Я не могу быть уверен в этом, не увидев полный код Java. Но нативный метод определяется как статический, а java-метод getMyString() не является статичным. Так из JNI, как вы получили obj, необходимый для вызова getMyString()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...