繁体   English   中英

如何通过JNI在Java中调用重写的超类方法?

[英]How to call an a overridden super class method in Java through JNI?

我试图用本机实现覆盖活动回调方法(将Lua挂钩到活动中)。 但是,我试图在JNI代码中调用超类方法,这是回调所需的。

例如,我有一个这样的类:

class TestActivity extends Activity {

    @Override
    protected native void onCreate(Bundle bundle);

    static {
        System.loadLibrary("test-jni")
    }
}

我正在尝试在C中实现TestActivity.onCreate() ,如下所示:

void Java_test_TestActivity_onCreate(JNIEnv* env, jobject obj, jobject bundle)
{
    // Get class, super class, and super class method ID...
    jclass objcls = (*env)->GetObjectClass(env, obj);
    jclass sprcls = (*env)->GetSuperclass(env, objcls);
    jmethodID methid = (*env)->GetMethodID(env, sprcls, "onCreate", "(Landroid/os/Bundle;)V");

    // Call super class method...
    (*env)->CallVoidMethod(env, obj, methid, bundle);
}

但是,当我尝试此代码时, TestActivity.onCreate()在其自身而不是Activity.onCreate()调用,产生此错误:

JNI ERROR (app bug): local reference table overflow (max=512)

我认为jmethodID特定于一个类并且会识别超级方法,但事实并非如此。

所以我的问题是,你如何实现这个......

@Override
protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
}

在JNI?

您可以尝试CallNonVirtualVoidMethod():请参阅http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp4581

你可以这样做:

protected void onCreate(Bundle bundle)
{
    super.onCreate(bundle);
    onCreate0(bundle);
}

private native void onCreate0(Bundle bundle);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM