Android app内接入cocos 2dx js 所遇问题

2,569 阅读3分钟

因项目原因,需要在应用内接入cocos2dx-js写的游戏,此前从未接触过此类需求,也不会js,特开此文,记录自己遇到的问题。(长久更新)

  1. 使用cocos Creator 编译android 项目报错

     The "android" command is deprecated.
     For manual SDK, AVD, and project management, please use Android Studio.
     For command-line tools, use tools/bin/sdkmanager and tools/bin/avdmanager
     Invalid or unsupported command "update project -t android-22 -p /Users/XXXX/Documents/XXXX/build/jsb-link/frameworks/runtime-src/proj.android-studio/app"
     Supported commands are:
     android list target
     android list avd
     android list device
     android create avd
     android move avd
     android delete avd
     android list sdk
     android update sdk
     Error running command, return code: 2.
    

原因:是因为 sdk/tools的版本过高导致的,需要使用低版本的tools覆盖即可

  1. 在使用第三方封装好的框架时,如果框架内加载了其他第三方库,要注意里面库的版本,因为可能库的版本太低,导致没有新版本的方法从而报错。情况:在应用内跳转cocos2dx的游戏界面时,一直报错 java.lang.NoSuchMethodError: No virtual method newWebSocket (Lokhttp3/Request;Lokhttp3/WebSocketListener;) Lokhttp3/WebSocket; in class Lokhttp3/OkHttpClient; or its super classes (declaration of 'okhttp3.OkHttpClient' appears in /data/app/com.quangames.a.paiju-1/split_lib_dependencies_apk.apk:classes22.dex)

    是因为我使用的网络框架时封装好的OKGO,而OKGO中的OKHttp的版本是使用的3.4.1版,而 cocos2dx中封装的网络类需要使用3.5.0版本,版本过低导致方法不存在。

  2. 在进入cocos2dx-js的游戏界面后,点击游戏界面中的返回键,会导致app进程被杀死。

     // 游戏退出时,所调用的js代码   
     PaiJuAppClient.prototype.jsbEnd = function(){
         if(DeviceUtils.isIOS()){
             cc.director.stopAnimation();
             jsb.reflection.callStaticMethod("TGGameStaticController",popVC");
         } else {
             cc.director.end(); // android 调用方法
         }
     };
    

起初以为是 cc.director.end(); 导致应用被杀死,后改为使用反射调用本地activity 的方法

    jsb.reflection.callStaticMethod("../GameActivity", "stopGameControl","()V");

但是app还是会被杀死,后经过google搜索,发现是由于点击退出,会调用Cocos2dxHelper中的terminateProces() ,导致进程被杀死,注释掉此行代码即可。 然后点击退出就会反射调用本地自己写的方法

    public static void terminateProcess() {
    //  android.os.Process.killProcess(android.os.Process.myPid());
    }
  1. 在进入cocos2dx游戏后,游戏退出,再次进入界面会进入黑屏状态,过一会应用会闪退,原因是因为,当finish掉该activity后,其中的runOnGlThread()中的线程还在执行,Cocos2dxGLSurfaceView 并没有被销毁掉。 解决方法:在AndroidManifest中,在游戏所在的activity标签,设置独立的进程

     android:process="com.exam.game"
    

然后如果已经把Cocos2dxHelper中的terminateProcess()内容注释掉了,解开注释,然后在返回监听中,设置杀掉当前线程。 android.os.Process.killProcess(android.os.Process.myPid()); // 杀死进程 此杀掉进程方法,无需在js中调用本地方法,这是无论是游戏内退出,还是返回退出,都会杀死进程,再次进入会重新初始化游戏界面。不再出现黑屏情况。 5. 把嵌入游戏的项目提交到SVN发现,libs中的.so文件,和obj中的.a文件,无法上传到SVN中。 原因是:SVN默认配置中,会忽略掉.so/.a等很多后缀结尾的文件,在svn的配置中,把.so/.a文件从。igonre移除即可。 我使用的是MAC的Cornerstone来提交SVN。打开Cornerstone它的设置,按图所示,把user default global ignores的选中去掉,删除其中你想要移除的文件后缀即可。

image.png