Cocos creator2.4.4 处理 16KB 问题
资料整理:
1:https://forum.cocos.org/t/topic/169291 (-x版本3.7升级)
2:https://github.com/cocos/engine-native/pull/4403/commits/ef13063c68db4403a347e7bf7b8422b81bdd2416 (官方提供升级方案)
3: 一下多数问题 都是靠豆包解决的~ AI真牛逼啊,省了不少事,我用的版本是2.4.4 大家遇到的问题可能都不太一样,问问豆包即可~
官方需要修改的内容我就不重复了,大家参照官方提供的 提交日志,下面是 android工程修改如下:
1:修改sdk版本 — 路径:/jsb-default/frameworks/runtime-src/proj.android-studio/gradle.properties
# Android SDK version that will be used as the compile project
PROP_COMPILE_SDK_VERSION=36
# Android SDK version that will be used as the earliest version of android this application can run on
PROP_MIN_SDK_VERSION=23
# Android SDK version that will be used as the latest version of android this application has been tested on
PROP_TARGET_SDK_VERSION=36
# Android Build Tools version that will be used as the compile project
PROP_BUILD_TOOLS_VERSION=36.0.0
#这里如果用了官方例子里面提供的 PROP_NDK_VERSION= 则需要手动注释掉 jsb-default/frameworks/runtime-src/proj.android-studio/local.properties 中的ndk.dir
PROP_NDK_VERSION=28.1.13356709
#删除 PROP_APP_ABI=armeabi-v7a:arm64-v8a:x86:x86_64 中 x86 好像是后面提到的替换libuv库并不支持x86
PROP_APP_ABI=armeabi-v7a:arm64-v8a:x86_64
2:ndk版本在:
3: classpath 'com.android.tools.build:gradle:8.10.1'
4: distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
5: 按照官方给的文档:https://github.com/cocos/engine-native/pull/4403/commits/ef13063c68db4403a347e7bf7b8422b81bdd2416 工程里的配置相关代码,修改后我这里还需要一下代码(每个人的问题可能不一样,问下豆包)
(1)
// pv_mp3dec_fxd_op_c_equivalent.h android 16kb修改
// #define Qfmt_31(a) (Int32)((float)a*0x7FFFFFFF) 修改为
#define Qfmt_31(x) ((int32)((x) * 2147483647.0))
(2)
遇到问题:/Users/mac/Desktop/LuLinSdkForZip/1000051-az/LuLin/tw-applink-next/jsb-default/frameworks/cocos2d-x/external/sources/pvmp3dec/src/pvmp3_dct_9.cpp:140:48: error: implicit conversion from 'int' to 'float' changes value from 2147483647 to 2147483648 [-Werror,-Wimplicit-const-int-float-conversion] 140 | vec[8] = fxp_mac32_Q32(vec[8], tmp0 << 1, cos_4pi_9); | ^~~~~~~~~ /Users/mac/Desktop/LuLinSdkForZip/1000051-az/LuLin/tw-applink-next/jsb-default/frameworks/cocos2d-x/external/sources/pvmp3dec/src/pvmp3_dct_9.cpp:84:21: note: expanded from macro 'cos_4pi_9' 84 | #define cos_4pi_9 Qfmt31( 0.17364817766693f) | ^~~~~~~~~~~~~~~~~~~~~~~~~~ /Users/mac/Desktop/LuLinSdkForZip/1000051-az/LuLin/tw-applink-next/jsb-default/frameworks/cocos2d-x/external/sources/pvmp3dec/src/pvmp3_dct_9.cpp:80:32: note: expanded from macro 'Qfmt31' 80 | #define Qfmt31(a) (int32)(a*(0x7FFFFFFF)) | ~ ^~~~~~~~~~ <a href="open.plugin.studio.bot">Ask Gemini</a>
解决方法:
// pvmp3_dct_9.cpp android 16kb修改
// #define Qfmt31(a) (int32)(a*(0x7FFFFFFF)) 修改为
#define Qfmt31(a) (int32)(a * (float)0x7FFFFFFF)
(3)
遇到问题:C/C++: fcntl(): Bad file descriptor C/C++: /Users/mac/Desktop/LuLinSdkForZip/1000051-az/LuLin/tw-applink-next/jsb-default/frameworks/cocos2d-x/external/sources/pvmp3dec/src/pvmp3_alias_reduction.cpp:172:70: error: implicit conversion from 'int' to 'float' changes value from 2147483647 to 2147483648 [-Werror,-Wimplicit-const-int-float-conversion] C/C++: 172 | used_freq_lines = fxp_mul32_Q32(used_freq_lines << 16, (int32)(0x7FFFFFFF / (float)18 - 1.0f)) >> 15; C/C++: | ^~~~~~~~~~ ~ C/C++: 1 error generated.
解决方法:
// pvmp3_alias_reduction.cpp android 16kb修改
// used_freq_lines = fxp_mul32_Q32(used_freq_lines << 16, (int32)(0x7FFFFFFF / (float)18 - 1.0f)) >> 15; 修改为
used_freq_lines = fxp_mul32_Q32(used_freq_lines << 16, (int32)((float)0x7FFFFFFF / 18.0f - 1.0f)) >> 15;
(4)
我这使用的sdk 有删除东西需要再 jsb-default/frameworks/runtime-src/proj.android-studio/app/proguard-rules.pro 增加 (这个是我这需要增加的处理不一定大家都需要)
# android 16kb修改
-dontwarn com.kanxd.emulator.jni.KxdEmulatorChecker
-dontwarn kotlinx.parcelize.Parcelize
6:好像是说之前的写法不能用了,需要把package移动个位置
(1)修改后原始工程下中jsb-default/frameworks/runtime-src/proj.android-studio/app/AndroidManifest.xml
标红处需要移动到:jsb-default/frameworks/runtime-src/proj.android-studio/app/build.gradle
(2)修改 jsb-default/frameworks/cocos2d-x/cocos/platform/android/libcocos2dx/AndroidManifest.xml
标红处移动到:jsb-default/frameworks/cocos2d-x/cocos/platform/android/libcocos2dx/build.gradle
(3)如果遇到 jsb-default/frameworks/runtime-src/proj.android-studio/instantapp/AndroidManifest.xml 的提示,同理
7:打包后遇到 问题
ld.lld: error: relocation R_AARCH64_PREL64 cannot be used against symbol 'OPENSSL_armcap_P'; recompile with -fPIC >>> defined in /Users/mac/Desktop/LuLinSdkForZip/1000051-az/LuLin/tw-applink-next/jsb-default/frameworks/cocos2d-x/external/android/arm64-v8a/libcrypto.a(armcap.o) >>> referenced by sha256-armv8.o:(.text+0xF48) in archive
解决方法:这里需要从 https://github.com/KDAB/android_openssl 下载 ssl_1.1的库
然后使用库里面所带的 libcrypto.a和libssl.a
替换项目中的 jsb-default/frameworks/cocos2d-x/external/android
8: 继续打包会遇到:libuv.a 编译不过 `ld.lld: error: undefined hidden symbol: __stack_chk_fail_local
解决方法:这里需要把 直接使用cocos creator 3.8.1版本的Creator\3.8.1\resources\resources\3d\engine-native\external\android中的 libuv.a 替换咱们本地的文件既可。