Creator 1.4.2 构建default编译后执行java调用js崩溃

Creator1.4.2版本,构建default编译后安装到手机,通过按钮点击调用java静态函数执行如下语句:Cocos2dxJavascriptJavaBridge.evalString(“console.log(‘Hello World’)”);,直接闪退,android studio的控制台显示如下错误:
Fatal signal 11 (SIGSEGV), code 1, fault addr 0x30 in tid 4201

论坛搜索到Creator 1.2.2beta2版本就有这个问题,看帖子说后面修复了,为啥现在又出现了,哪位解答下啊.在执行Cocos2dxJavascriptJavaBridge.evalString这个java语句之前打印的日志都能正常显示,到这行就挂了:joy:

Cocos2dxJavascriptJavaBridge 执行环境是 GL 线程么?

我是js端用一个按钮调用java静态函数注册了一个BroadcastReceiver来监听电量变化,当电量变化的时候,由java端回调js的全局函数来通知js这边电量改变了,应该不算GL线程吧

我在android studio下调试,最后日志输出:E/Utils: cc.onBatteryChanged(83);
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x6 in tid 7006 (com.game.test)
class BatteryBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)){
                //得到系统当前电量
                int level=intent.getIntExtra("level", 0);
                //取得系统总电量
                int total=intent.getIntExtra("scale", 100);

                int percent = ((level*100)/total);
                String js = "cc.onBatteryChanged("+ percent +");";

                Log.e(TAG, js);
                
                Cocos2dxJavascriptJavaBridge.evalString("var i = 0;");

// Cocos2dxJavascriptJavaBridge.evalString(js);

                Log.e(TAG, "当前电量:"+(level*100)/total+"%");
            }
        }
    }

问题就在这里,你是从 UI 线程获得的回调,直接调用运行在 GL 线程的 Spidermonkey 函数是不行的,必须用

Director::getInstance()->getScheduler()->performFunctionInCocosThread([]() -> void {
    Cocos2dxJavascriptJavaBridge.evalString("var i = 0;");
})

这种形式来调用才是线程安全的

1赞

:gift:非常感谢,按照你的思路,我写了一个jni调用,由java调用c++,在c++里面再调用ScriptingCore::getInstance()->evalString方法执行UI上的js脚本,搞定!可能java层提供的调用js函数只是为了调用普通的js,并没考虑这种调用UI层的js脚本.总算是解决了

在main.cpp里面加个jni调用函数

#include “scripting/js-bindings/manual/ScriptingCore.h”

void Java_org_cocos2dx_javascript_Utils_evalString(JNIEnv* env, jobject thiz, jstring arg)
{
const char *nativeString = env->GetStringUTFChars(arg, 0);

  std::string js(nativeString);
  LOGD("Java_org_cocos2dx_javascript_Utils_evalString(%s)", js.c_str());
  Director::getInstance()->getScheduler()->performFunctionInCocosThread([=]() -> void {
      ScriptingCore::getInstance()->evalString(js.c_str());
  });

  env->ReleaseStringUTFChars(arg, nativeString);

}

java端随便找个类里面定义:private static native void evalString(String js);

java端调用的地方直接调用evalString(“这里是js代码”);

最后才发现java里面已经有相应的接口,直接调用如下:
Cocos2dxHelper.runOnGLThread(new Runnable() {
@Override
public void run() {
Cocos2dxJavascriptJavaBridge.evalString(js);
}
});