返回

COCOS2DX3.17.2 Android升级targetSDK30疑难问题及解决思路

Android

将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 库。具体操作步骤如下:

  1. 在项目的 build.gradle 文件中添加以下依赖:
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
  1. 在代码中,将 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 函数。具体操作步骤如下:

  1. 在项目的 AndroidManifest.xml 文件中添加以下标签:
<application android:targetSdkVersion="30" ...>
  <uses-library android:name="android.test.runner" android:required="false" />
</application>
  1. 在代码中,将 dlopen 函数替换为 dlopen2 函数。

结语

在本文中,我们详细分析了 COCOS2DX 3.17.2 在 Android 上将 targetSDK 升级至 30 时可能遇到的两个异常问题及其对应的解决方案。希望这些解决方案能够帮助开发者轻松应对升级后的潜在问题,确保应用的正常运行。

常见问题解答

  1. 为什么要升级 targetSDK?

升级 targetSDK 可以利用 Android 平台的最新功能和安全补丁。

  1. 除了文中提到的异常,还有其他需要注意的问题吗?

升级 targetSDK 可能还会遇到其他问题,具体取决于项目的具体情况。

  1. 升级 targetSDK 后,需要对项目做哪些调整?

升级 targetSDK 可能需要调整项目的构建配置和代码以适应新版本的 Android 平台。

  1. 升级 targetSDK 有哪些好处?

升级 targetSDK 可以提高应用的安全性、性能和功能。

  1. 升级 targetSDK 有什么风险?

升级 targetSDK 可能导致与旧版本 Android 设备不兼容或其他问题。