2013-06-04 15 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); 
} 

Activity.onCreate()の代わりにTestActivity.onCreate()が呼び出され、このエラーが発生します。

JNI ERROR (app bug): local reference table overflow (max=512)

私はjmethodIDがクラスに固有であり、スーパーメソッドを特定すると考えましたが、そうではありませんでした。

だから私の質問は、どのようにこれを実装するのですされ

... JNIで

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

?あなたがこれを行うことができ

答えて

0

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

private native void onCreate0(Bundle bundle); 
+0

を参照してください。それでも、方法があるかどうかを知りたいです。 – jmbx3nu

関連する問題