因项目原因,需要在应用内接入cocos2dx-js写的游戏,此前从未接触过此类需求,也不会js,特开此文,记录自己遇到的问题。(长久更新)
-
使用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覆盖即可
-
在使用第三方封装好的框架时,如果框架内加载了其他第三方库,要注意里面库的版本,因为可能库的版本太低,导致没有新版本的方法从而报错。情况:在应用内跳转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版本,版本过低导致方法不存在。
-
在进入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()); }复制代码
-
在进入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的选中去掉,删除其中你想要移除的文件后缀即可。