COCOS2DX3.17.2 Android升级targetSDK30疑难问题及解决思路
2024-02-02 04:16:45
将COCOS2DX 3.17.2 的 targetSDK 升级到 30 时可能遇到的两个异常问题
随着 Android 平台的不断发展,谷歌持续推出新版本以增强系统的安全性、性能和功能。作为一款流行的跨平台游戏引擎,COCOS2DX 也需要不断更新以适应 Android 平台的变化。在本文中,我们将重点探讨在将 COCOS2DX 3.17.2 的 targetSDK 升级到 30 时可能遇到的两个异常问题及其对应的解决方案。
异常点 1:c++ 调用 lua 接口,pushObjiect 的时候 crash
问题
在将 targetSDK 升级到 30 后,在 c++ 中调用 lua 接口时,使用 pushObjiect 函数可能会导致程序 crash。
问题分析
在 Android 9.0 以下的版本中,系统默认支持 Apache HTTP client 库。但在 Android 11 及以上版本中,Apache HTTP client 库已被弃用,取而代之的是 HttpURLConnection 库。因此,在升级 targetSDK 后,如果程序中使用了 Apache HTTP client 库,就会出现问题。
解决方案
为了解决这个问题,需要将程序中使用的 Apache HTTP client 库替换为 HttpURLConnection 库。具体操作步骤如下:
- 在项目的 build.gradle 文件中添加以下依赖:
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
- 在代码中,将 Apache HTTP client 库的代码替换为 HttpURLConnection 库的代码。
异常点 2:lua 调用 c++ 绑定接口的时候报错 [LUA ERROR] bad light userdata pointer
问题
在将 targetSDK 升级到 30 后,在 lua 中调用 c++ 绑定接口时,可能会出现 [LUA ERROR] bad light userdata pointer 的错误。
问题分析
这个问题的原因是,在 Android 11 及以上版本中,系统对动态库的加载方式进行了修改。在旧版本中,动态库是通过 dlopen 函数加载的,而在新版本中,动态库是通过 dlopen2 函数加载的。因此,在升级 targetSDK 后,如果程序中使用了 dlopen 函数加载动态库,就会出现问题。
解决方案
为了解决这个问题,需要将程序中使用的 dlopen 函数替换为 dlopen2 函数。具体操作步骤如下:
- 在项目的 AndroidManifest.xml 文件中添加以下标签:
<application android:targetSdkVersion="30" ...>
<uses-library android:name="android.test.runner" android:required="false" />
</application>
- 在代码中,将 dlopen 函数替换为 dlopen2 函数。
结语
在本文中,我们详细分析了 COCOS2DX 3.17.2 在 Android 上将 targetSDK 升级至 30 时可能遇到的两个异常问题及其对应的解决方案。希望这些解决方案能够帮助开发者轻松应对升级后的潜在问题,确保应用的正常运行。
常见问题解答
- 为什么要升级 targetSDK?
升级 targetSDK 可以利用 Android 平台的最新功能和安全补丁。
- 除了文中提到的异常,还有其他需要注意的问题吗?
升级 targetSDK 可能还会遇到其他问题,具体取决于项目的具体情况。
- 升级 targetSDK 后,需要对项目做哪些调整?
升级 targetSDK 可能需要调整项目的构建配置和代码以适应新版本的 Android 平台。
- 升级 targetSDK 有哪些好处?
升级 targetSDK 可以提高应用的安全性、性能和功能。
- 升级 targetSDK 有什么风险?
升级 targetSDK 可能导致与旧版本 Android 设备不兼容或其他问题。