私はネイティブの実装でアクティビティコールバックメソッドをオーバーライドしようとしています(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);
}
?あなたがこれを行うことができ
Arg、参照でそれを逃した。すぐに実行されます。ありがとう! – jmbx3nu