簡體   English   中英

使用cocos2dx中的C ++將文件從資產復制到android的內部存儲器

[英]Copy a file from assets to internal memory of android using c++ in cocos2dx

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

我想將資產文件夾中存在的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

這是另一個類似的問題

如何從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);

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中)或從存儲設備讀取(對於其他文件)。

注意:此解決方案不是線程安全的

正如@Selvin所說,
您需要通過jni將AssetManager對象從Java傳遞到本機層。 這是一些例子。

#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>
AAssetManager   *mgr;

void Java_pe_berabue_ex_GLView_nativeCreated(JNIEnv * env, jclass cls, jobject assetManager)
{
    char *buf;
    int fileSize;

    mgr = AAssetManager_fromJava(GetEnv(), assetManager);

    AAsset* asset = AAssetManager_open(mgr, "tmp.txt", AASSET_MODE_UNKNOWN);    

    if ( asset == NULL )
        return;

    fileSize = AAsset_getLength(asset);

    if ( fileSize == 0 )
        return;

    buf = (char *)malloc(sizeof(char)*fileSize);
    AAsset_read(asset, buf, fileSize);

    AAsset_close(asset);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM