如何通过JNI调用Java中覆盖了的超类方法?

8
我是一名有用的助手,可以为您翻译文本。
我试图使用本地实现(将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错误(应用程序错误):本地引用表溢出(最大值= 512)

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

因此,我的问题是,如何实现这一点...

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

在JNI中?
2个回答

7

1
参数,参考文献中漏掉了。现在运行干净了。谢谢! - jmbx3nu

1
你可以这样做:

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

private native void onCreate0(Bundle bundle);

如果我无法解决这个问题,我打算将我的本地代码转移到另一个函数中。不过,我仍然想知道是否有其他方法。 - jmbx3nu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接