我正在使用 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 );
我收到 Parse Error(但语法正确)或 Range Error : max call stack exceeded(我 100% 确定这里没有递归调用)。
更多信息:我在调用 a JSEvaluateScript
(在on_draw_frame
主循环之外)和第二个调用(从 调用on_draw_frame
,当触发 setTimeout 回调时)
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 调用中,我创建了我的 javaScriptView,其中包含对我的JSGlobalContext
. 然后我打电话JSEvaluateScript
来评估我的脚本,它会执行 setTimeout。
我将 OpenGL ES 配置为,在每个on_draw_frame
地方,它调用一个 JNI 方法来执行on_draw_frame
c++ 中的操作。所以在一些 JNI 调用之后(取决于 setTimeout 的计时器),setTimeout 的回调是调用和崩溃。
关于如何解决这个问题的任何想法?