cocos2dx CCFileUtils::sharedFileUtils() 静态调用

在Android平台上,静态调用CCFileUtils::sharedFileUtils()可能导致应用崩溃,原因在于该调用发生在静态区,此时java回调未设置g_apkPath值。而在iOS平台上,此问题不会出现。建议避免全局区调用CCFileUtils::sharedFileUtils()以防止类似问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如题

CCFileUtils::sharedFileUtils()

静态调用,也就是在cpp文件的函数外面调用

Android平台会无故崩溃,跟踪调试发现在CCFileUtilsAndroid.cpp的42行过不去即

CCFileUtils* CCFileUtils::sharedFileUtils()
{
    if (s_sharedFileUtils == NULL)
    {
        s_sharedFileUtils = new CCFileUtilsAndroid();
        s_sharedFileUtils->init();
        std::string resourcePath = getApkPath();
        s_pZipFile = new ZipFile(resourcePath, "assets/");
    }
    return s_sharedFileUtils;
}
std::string resourcePath = getApkPath();

这行 然后查看getApkPath()函数,里面也就返回string g_apkPath 的c_str()

最后没查出别的有用信息,不过此时g_apkPath应该是null,因为g_apkPath是依靠java那边回调才设置的值

JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxHelper_nativeSetApkPath(JNIEnv*  env, jobject thiz, jstring apkPath) {
        g_apkPath = JniHelper::jstring2string(apkPath);
    }

而静态调用了CCFileUtils::sharedFileUtils(),发生在静态区

而java加载libgame.so的方法如下

static {
		System.loadLibrary("game");
	}
可想而知getApkPath的调用就会在nativeSetApkPath之前

所以CCFileUtils::sharedFileUtils()就不要在全局区调用了(也就是静态调用)


但是ios平台,是没有问题



ps:遇到问题就先记录,以免以后再次遇到,耗费时间去找问题



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值