2013-06-04 21 views
5

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?

risposta

0

Si potrebbe fare questo:

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

private native void onCreate0(Bundle bundle); 
+0

ero planata su scarico mia roba nativo di una funzione diversa, se non riuscivo a capirlo. Tuttavia, mi piacerebbe sapere se c'è un modo. – jmbx3nu

Problemi correlati