使用cocos2dx中的c ++将文件从资产复制到android的内部存储器

时间:2014-03-11 07:45:59

标签: android c++ android-ndk cocos2d-x cocos2d-x-3.0

我正在研究cocos2dx版本3.0-alpha0。

我想将assets文件夹中存在的txt复制到android设备的内部存储器中。

到目前为止我已经

`   string originalPath = FileUtils::getInstance()->fullPathForFilename("example.txt");
    string dbPath = FileUtils::getInstance()->getWritablePath();
    dbPath.append("example.txt");
    FILE* source = fopen(originalPath.c_str(), "rb");

    if (source!=NULL)
    {
        log("source example open");
    }else{
        log("source example not open");
    }
    FILE* dest = fopen(dbPath.c_str(), "wb");
    if (dest!=NULL)
    {
        log("dest example open");
    }else{
        log("dest example not open");
    }
    unsigned long size2 = 0;
    unsigned char* smth = FileUtils::getInstance()->getFileData(originalPath.c_str(), "r", &size2);
    log("Size: %lu\n\n",size2);
    log("size:%zu",fread(buf, size2, BUFSIZ, source));

    // clean and more secure
    // feof(FILE* stream) returns non-zero if the end of file indicator for stream is set

    while ((size = fread(buf, 1, BUFSIZ, source))) {
        fwrite(buf, 1, size, dest);
    }

    fclose(source);
    log("establishConnection9");
    fclose(dest);
    log("establishConnection10");

`

在ios的情况下它工作正常,但在Android的情况下。从资产中获取文件并不容易。

在android ndk中我们有asset_manager.h

但我不知道如何使用它。 我发现很少有用的链接,但不知道如何初始化那些。

http://en.wikibooks.org/wiki/OpenGL_Programming/Android_GLUT_Wrapper#Accessing_assets

这是另一个类似的问题

How To Get File In Assets From Android NDK

但我不知道如何获得mgr

AAssetDir* assetDir = AAssetManager_openDir(mgr, "");
const char* filename = (const char*)NULL;
while ((filename = AAssetDir_getNextFileName(assetDir)) != NULL) {
    AAsset* asset = AAssetManager_open(mgr, filename, AASSET_MODE_STREAMING);
    char buf[BUFSIZ];
    int nb_read = 0;
    FILE* out = fopen(filename, "w");
    while ((nb_read = AAsset_read(asset, buf, BUFSIZ)) > 0)
        fwrite(buf, nb_read, 1, out);
    fclose(out);
    AAsset_close(asset);
}
AAssetDir_close(assetDir);

2 个答案:

答案 0 :(得分:4)

Android平台上的所有应用程序资源都存储在APK文件中(实际上就是简单的Zip存档)。我们需要从APK中提取文件,然后将其保存到内部存储中。 Cocos2d-x已经具备了您需要的所有功能。

//First - get asset file data:
auto data =  FileUtils::getInstance()->getDataFromFile(filePath);

//second - save it:
string dbPath = FileUtils::getInstance()->getWritablePath() + path;

FILE* dest = fopen(dbPath.c_str(), "wb");
fwrite(data.getBytes(), 1, data.getSize(), dest);
fclose(dest);

Cocos2d-x FileUtils::getInstance()->getDataFromFile(filePath)检查filePath是否为APK资产路径,然后解压缩此文件(如果在APK中)或从存储设备读取(对于其他文件)。

注意:此解决方案不是线程安全的

答案 1 :(得分:0)

正如@Selvin所说, 您需要通过jni将AssetManager对象从java传递到本机层。 这是一些例子。

 mysql -u root -p -e "CREATE DATABASE {DB_NAME} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;"