【问题标题】:NoSuchMethodError on android View method in JNI GetMethodIDJNI GetMethodID中的android View方法上的NoSuchMethodError
【发布时间】:2020-07-24 09:32:49
【问题描述】:

我正在尝试通过Android 类android.view.View 上的JNI 获取一些methodID。我设法通过 JNI 获得了许多其他方法,但是 JNI 找不到在 android.view.View 中实现的另一种方法,以及我尝试获得的另一种方法(setLayoutParams)。这是我使用的代码,我最终得到了找不到方法的日志。还有一个 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;
}

它与 View 类有关吗?我怎样才能得到这个方法?

【问题讨论】:

    标签: java android c android-ndk java-native-interface


    【解决方案1】:

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

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

    固定mSetOnClickListener 声明:

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

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

    【讨论】:

    • 谢谢,我也刚刚意识到,在尝试从同一类中获取其他方法时!
    • @Gaeris14,不客气。很高兴你也发现了!
    • 道德:使用javap -s 生成JNI 方法签名。不要自己动手,没有意义。
    猜你喜欢
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多