JavaScriptCore と JNI を使用しており、Open GL ES Android アプリケーションで JS コードを使用しようとしています。
JSEvaluateScript, JSObjectMakeFunction, JSObjectCallAsFunction
タイマーを使用せずにメインループで呼び出すと(したがって、への最初の呼び出しの前にon_draw_frame
)、すべて問題ありません。
しかし、私が試してみるJSEvaluateScript, JSObjectMakeFunction, JSObjectCallAsFunction
とdrawInRest
、または/および setTimeout の実装を使用して
setTimeout ( function () {
console.log("i'm in the callback");
}, 1000 );
解析エラー (ただし、構文は正しい) または範囲エラー: 最大呼び出しスタックを超えています (ここに再帰呼び出しがないことは 100% 確信しています)。
詳細情報:私はこれを(メインループJSEvaluateScript
の外側の)呼び出しと2番目の呼び出し( setTimeoutコールバックをトリガーするときにから呼び出す)の間にこれを取得しますon_draw_frame
on_draw_frame
11-08 15:52:03.905: D/libEGL(2916): loaded /system/lib/egl/libEGL_emulation.so
11-08 15:52:03.915: D/(2916): HostConnection::get() New Host Connection established 0x2a1d68d8, tid 2916
11-08 15:52:03.925: D/libEGL(2916): loaded /system/lib/egl/libGLESv1_CM_emulation.so
11-08 15:52:03.935: D/libEGL(2916): loaded /system/lib/egl/libGLESv2_emulation.so
11-08 15:52:03.976: W/EGL_emulation(2916): eglSurfaceAttrib not implemented
11-08 15:52:03.985: D/OpenGLRenderer(2916): Enabling debug mode 0
11-08 15:52:04.026: D/(2916): HostConnection::get() New Host Connection established 0x2a1e5ae0, tid 2929
編集: エラーが発生する場所を見つけます: 最初の JNI 呼び出しの後。
私は説明する :
最初の JNI 呼び出しで、my への静的参照を含む javaScriptView を作成しますJSGlobalContext
。JSEvaluateScript
次に、setTimeout を実行するスクリプトを評価するために呼び出します。
私は OpenGL ES を設定して、それぞれon_draw_frame
で JNI メソッドを呼び出してon_draw_frame
c++ で実行します。そのため、いくつかの JNI 呼び出し (setTimeout のタイマーに依存) の後、setTimeout のコールバックが呼び出されてクラッシュします。
これを修正する方法についてのアイデアはありますか?