-1

我正在使用 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_framec++ 中的操作。所以在一些 JNI 调用之后(取决于 setTimeout 的计时器),setTimeout 的回调是调用和崩溃。

关于如何解决这个问题的任何想法?

4

1 回答 1

0

尝试运行JSEvaluateScriptJSObjectMakeFunctionJSObjectCallAsFunction在一个线程中。如果你从 调用 on_draw_frame onDrawFrame(GL10 gl),这是从另一个线程调用的,而不是onCreate()在 MainActivity (你在其中初始化 js),所以它可能是你的问题的原因。在 onDrawFrame(GL10 gl) 中尝试一次 init js。

于 2013-11-21T08:34:58.873 回答