android 在 JNI GetMethodID 中查看方法时出现 NoSuchMethodError

NoSuchMethodError on android View method in JNI GetMethodID

我正在尝试通过 Android class android.view.View 上的 JNI 获取一些方法 ID。我设法通过 JNI 获得了很多其他方法,但是 JNI 无法找到这个方法,以及我试图获得的另一种方法(setLayoutParams),这些方法在 android.view.View 中实现。这是我使用的代码,最后我得到的日志是找不到方法。然后还有一个 noSuchMethodError 异常。

jint JNI_OnLoad(JavaVM *vm, void *reserved) {
    JNIEnv *env;
    int status;

    status = (*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_4);
    if (status < 0) {
        status = (*vm)->AttachCurrentThread(vm, (void **) &env, NULL);
        if (status < 0) { return -1; }
    }

    jclass cView = (*env)->FindClass(env, "android/view/View");

    if (cView == NULL) {
        __android_log_write(ANDROID_LOG_DEBUG, "JNI", "can not find the class View ");
        return -1;
    }

    jmethodID mSetOnClickListener = (*env)->GetMethodID(env, cView, "setOnClickListener", "(Landroid/view/View/OnClickListener;)V");
    if (mSetOnClickListener == NULL) {
        __android_log_write(ANDROID_LOG_DEBUG, "JNI", "can not find the method setOnClickListener");
        return -1;
    }
    return 0;
}

是否与视图有关class?我怎样才能获得这种方法?

Class 名称必须使用 $ 符号分隔。示例:android/view/View$OnClickListener

我想你得到的是空值,因为格式错误。

固定mSetOnClickListener声明:

jmethodID mSetOnClickListener = (*env)->GetMethodID(env, cView, "setOnClickListener", "(Landroid/view/View$OnClickListener;)V"); 

setLayoutParams 也是如此,因为它接受一个内部 class ViewGroup.LayoutParams 实例作为参数。