zoukankan      html  css  js  c++  java
  • Call to unavailable function 'system': not available on iOS问题的解决方案

    Call to unavailable function 'system': not available on iOS问题的解决方案 

    标签: cocos2d-xcocos-creatorxcodeios
     分类:
       

    cocos2dx项目或者cocos creator开发的项目中,当导出iOS项目之后,正常来说是没有问题的,但是,当Xcode升级到9.0时,运行Xcode项目会报错,也就是标题的那个从错误,这就有点头疼了,因为报错部分是在CCFileUtils.cpp文件中,这个是cocos生成的文件,我们一般不会修改这个文件,但是如果真的出了问题,实在是有点头疼。在网上找了一下解决方案,终于在官方的论坛里面找到了,这里把解决方案搬过来,便于大家沟通和交了。 
    这里是官方论坛的链接地址Call to unavailable function ‘system’: not available on iOS官方已经帮忙给出了解决办法,这里,将官方的办法重新讲解一遍。 
    官方提供的链接
    对应的是一个GitHub的链接,打开后,是对CCFileUtils.cpp文件的相关修改。这里简单说一下报错原因。原因是system命令不可用了,网上查了别的解决办法,有人说把system(command.c_str()); 改为popen(command.c_str(), “r”);但是我试了一下发现后面的命令也是不可用的,可能我操作有问题吧。。。下面继续说官方的办法。官方让我们对CCFileUtils.cpp文件进行修改,注意,这里不能直接把GitHub上面的这个文件的替换自己项目的该文件,因为2个项目的这个文件其实是不一样的,不同的地方,不仅仅是GitHub上面的变化。 
    首先找到对应的部分,搜索#include <dirent.h>,然后,在下面添加下面的代码:

    #if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID)
    #include <ftw.h>
    #endif
    • 1
    • 2
    • 3

    然后在新添加的代码下面有下面两个方法:

    bool FileUtils::isDirectoryExistInternal(const std::string& dirPath) const
    • 1

    bool FileUtils::createDirectory(const std::string& path)
    • 1

    在这两个方法的下面,添加如下代码:

    namespace
    {
    #if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID)
        int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf)
        {
            int rv = remove(fpath);
    
            if (rv)
                perror(fpath);
    
            return rv;
        }
    #endif
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    然后紧挨着的下面,有一个方法,叫做:

    bool FileUtils::removeDirectory(const std::string& path)
    • 1

    在方法的开始部分,添加下面内容:

    #if !defined(CC_TARGET_OS_TVOS)
    #if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID)
        if (nftw(path.c_str(), unlink_cb, 64, FTW_DEPTH | FTW_PHYS) == -1)
            return false;
        else
            return true;
    #else
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    方法结尾处添加下面内容:

    #endif // (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID)
    #endif // !defined(CC_TARGET_OS_TVOS)
    • 1
    • 2

    至此,就解决了该问题,对于该问题,我的理解是这里调用了系统底层的删除目录的命令,也就是system里面的方法,但是高版本的系统中,应该是屏蔽掉了这个系统命令,不允许调用了,所以,才会出现上面的问题。期待后面版本的cocos引擎或者creator能够修复这个问题。

  • 相关阅读:
    node体验
    JS练习--prototype的一道题目
    JS的OOP--继承之prototype
    JS的OOP--new一个function背后的实际操作
    JS中new运算符的运算顺序
    thymeleaf 拼接字符串与变量
    spring jpa exists
    LocalDateTime json格式化
    格式化java8 LocalDateTime
    springboot定时任务
  • 原文地址:https://www.cnblogs.com/cci8go/p/7592216.html
Copyright © 2011-2022 走看看