Sto tentando di sovrascrivere un metodo di callback delle attività con un'implementazione nativa (per collegare Lua a un'attività). Tuttavia, ho riscontrato un problema nel tentativo di chiamare il metodo della superclasse all'interno del codice JNI, come richiesto per il callback.Come chiamare un metodo di super classe sottoposto a override in Java tramite JNI?
Per esempio, ho una classe come questa:
class TestActivity extends Activity {
@Override
protected native void onCreate(Bundle bundle);
static {
System.loadLibrary("test-jni")
}
}
E sto cercando di attuare TestActivity.onCreate()
in C come questo:
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);
}
Tuttavia, quando provo questo codice, TestActivity.onCreate()
è chiamato in sé anziché Activity.onCreate()
, Producing questo errore:
JNI ERROR (app bug): local reference table overflow (max=512)
Pensavo che un jmethodID fosse specifico per una classe e avrebbe identificato il metodo super, tuttavia non era così.
Quindi la mia domanda è, come si fa a implementare questo ...
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
}
In JNI?
Arg, mancato quello nel riferimento. Funziona pulito ora. Grazie! – jmbx3nu