我正在使用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%确定这里没有递归调用)。
更多信息:
我在调用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方法在c ++中执行on_draw_frame
。所以经过一些JNI调用(取决于setTimeout的定时器),setTimeout的回调就是调用并崩溃。
有关如何解决此问题的任何想法?
答案 0 :(得分:0)
尝试在一个帖子中运行JSEvaluateScript
,JSObjectMakeFunction
和JSObjectCallAsFunction
。
如果从onDrawFrame(GL10 gl)
调用on_draw_frame,则会从MainActivity中的onCreate()
之外的另一个线程(在其中初始化js)调用此函数,因此它可能是您的问题的原因。
在onDrawFrame(GL10 gl)中尝试使用init js。