背景

国内各大安卓应用平台宣布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:545
在这里插入图片描述
AssetsManager.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架构的库:
在这里插入图片描述

更多推荐