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

 2023-01-20    307  

问题描述

我正在尝试使用本机实现(将LUA挂接到活动中)覆盖活动回调方法.但是,我已经遇到了一个障碍,试图在JNI代码中调用SuperClass方法,这是回调的要求.

例如,我有这样的课:

如何在Java中通过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是特定于类的jmethodid,并且会识别超级方法,但是事实并非如此.

所以我的问题是,您如何实施此功能…

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

在jni?

推荐答案

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

其他推荐答案

您可以做到这一点:

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

private native void onCreate0(Bundle bundle);

以上所述是小编给大家介绍的如何在Java中通过JNI调用超类的方法?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26198.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。