JNI NoSuchMethodException:参数类型为null

时间:2012-02-22 18:03:02

标签: java android reflection java-native-interface

我正在使用JNI中的Android调用实例方法。所有代码编译,但为了保护项目的内容,我只会显示代码的相关部分。以下代码块( c ++ 文件中使用的extern c)尝试访问 cls 中的静态方法[public String getMyString()]。我知道 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 :(得分:0)

如果没有看到完整的java代码,我无法确定这一点。但是本机方法被定义为静态,而java方法getMyString()是非静态的。那么从JNI开始,你是如何得到obj来调用getMyString()的?{/ p>