Android JNI JavascriptCore JSEvaluateScript,JSObjectMakeFunction,JSObjectCallAsFunction给出解析或范围错误

时间:2013-11-08 15:03:19

标签: javascript android c++ java-native-interface javascriptcore

我正在使用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:超出了最大调用堆栈(我100%确定这里没有递归调用)。

更多信息: 我在调用JSEvaluateScripton_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方法在c ++中执行on_draw_frame。所以经过一些JNI调用(取决于setTimeout的定时器),setTimeout的回调就是调用并崩溃。

有关如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:0)

尝试在一个帖子中运行JSEvaluateScriptJSObjectMakeFunctionJSObjectCallAsFunction。 如果从onDrawFrame(GL10 gl)调用on_draw_frame,则会从MainActivity中的onCreate()之外的另一个线程(在其中初始化js)调用此函数,因此它可能是您的问题的原因。 在onDrawFrame(GL10 gl)中尝试使用init js。