JNI NoSuchMethodException:参数类型为null



我正在使用Android中的JNI调用实例方法。所有的代码都编译好了,但为了保护项目的内容,我只会展示代码的相关部分。以下代码块(在c++文件中使用的extern c)尝试访问cls中的静态方法[public String getMyString()]。我知道clsenv不为空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似乎表明从nullClass<?>[](反射常见)的转换有问题,但我有一种感觉,这更多地与mid找到错误的方法或jstr返回错误有关(logcat声明jsontrNOT null)。

最后,Java端的相关代码如下:

本机调用:

public static native String getMyNativeString();

对本机方法的调用:

String myStr = callGetMyNativeString();

正在访问的方法:

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

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

相关内容

  • 没有找到相关文章

最新更新