- 背景
- 现有编译环境
- 升级步骤
- 编译报错修复
- 打包测试
国内各大安卓应用平台宣布2021年12月底,所有app需要提供64位架构包才能上架,具体可见:
我们项目因为上线比较早,用的引擎版本较低,没办法,必须升级,好在cocos早在3.13版本就已经支持android 64位架构,相对来讲和我们现在用的版本差异不是很大,所以升级工作还是比较简单的。
- Cocos2dx 3.5 (quick 3.5)
- JDK1.8.0
- android-ndk-r10e
- android-sdks
- apache-ant-1.9.3
1.下载Cocos2dx3.13版本源码,比较和当前版本差异,大致能确定引擎为支持64位安卓应用,更新了哪些第三方库,以及修改了哪些编译选项。
2.修改当前项目编译命令,增加–app-abi选项,并指定生成arm64-v8a架构,可以同时指定多个,但没必要。project_compile脚本里有说明:
group.add_argument("--app-abi", dest="app_abi", help='Set the APP_ABI of ndk-build. Can be multi value separated with ":".Sample : --app-aib armeabi:x86:mips. Default value is "armeabi".')
3.尝试打包,结果不出意外出现一些编译错误
编译报错修复1.多个三方库没有64位架构包
libcurl.a
Android NDK: ERROR:/Users/game/publish/frameworks/runtime-src/proj.android/../../cocos2d-x/external/curl/prebuilt/android/Android.mk:luajit_static: LOCAL_SRC_FILES points to a missing file Android NDK: Check that /Users/game/publish/frameworks/runtime-src/proj.android/../../cocos2d-x/external/curl/prebuilt/android/arm64-v8a/libcurl.a exists or that its path is correct
很明显是没有arm64-v8a架构的libcurl库,其他几个库找不到也是类似原因。
libluajit.a
Android NDK: ERROR:/Users/game/publish/frameworks/runtime-src/proj.android/../../cocos2d-x/external/lua/luajit/prebuilt/android/Android.mk:luajit_static: LOCAL_SRC_FILES points to a missing file Android NDK: Check that /Users/game/publish/frameworks/runtime-src/proj.android/../../cocos2d-x/external/lua/luajit/prebuilt/android/arm64-v8a/libluajit.a exists or that its path is correct
libfreetype.a
Android NDK: ERROR:/Users/game/publish/frameworks/runtime-src/proj.android/../../cocos2d-x/external/freetype2/prebuilt/android/Android.mk:cocos_freetype2_static: LOCAL_SRC_FILES points to a missing file Android NDK: Check that /Users/game/publish/frameworks/runtime-src/proj.android/../../cocos2d-x/external/freetype2/prebuilt/android/arm64-v8a/libfreetype.a exists or that its path is correct
解决办法:
替换3.13版本中对应的库文件和代码,直接拷贝prebuilt目录下arm64-v8a库到原目录,注意如果本身有对这些库进行修改,则要考虑是否要合并到新版本中,不要盲目覆盖。
2.语法错误
更新curl库后,逻辑模块出现几处同一原因造成的编译报错,如:
AssetsManager.cpp:545AssetsManager.h中_curl定义如下:
很明显与函数声明中参数类型不匹配:
解决方法:
将void * curl 定义改成 CURL * curl即可, 或者把curl.h中的
typedef struct Curl_easy CURL; 改回 typedef void CURL;
CC FileStorage 和 CCFileUtils-android 部分函数参数类型int改为ssize_t
3.其他警告
cc1plus: warning: unrecognized command line option “-Wno-extern-c-compat” cocos2dx早期版本用clang编译器才有的选项,用gcc编译器后废弃了,可以无视
cc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C 意思是指定c++版本,c语言库不支持,可以忽略
重新打包,成功生成apk文件,分别在安卓64位手机上安装测试正常运行,因为没找到32位手机,只能在32位的模拟器上安装测试,结果是安装不了,符合预期,在64位模拟器上能正常安装并运行。
解压apk也可以看出只生成了arm64-v8架构的库:



