2013-06-04 22 views
5

我试图重写一个本机实现的活动回调方法(将Lua挂钩到活动中)。不过,我试图在JNI代码中调用超类方法,正如回调所要求的。如何通过JNI在Java中调用重载的超类方法?

例如,我有这样一个类:

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?

回答

0

你可以这样做:

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

private native void onCreate0(Bundle bundle); 
+0

我刨卸载我的家乡的东西不同的功能,如果我不能弄明白。不过,我想知道是否有办法。 – jmbx3nu

相关问题