如何让文件在资产的Android NDK(How To Get File In Assets Fro

2019-06-21 02:13发布

我试图从本机端访问图像文件中的资产的文件夹。 现在,我可以通过资产文件夹及其子目录定位,我寻找的特定文件成功搜索:

AAssetDir* assetDir = AAssetManager_openDir(asset_manager, "images");
const char* filename;
while ((filename = AAssetDir_getNextFileName(assetDir)) != NULL)
{
   __android_log_print(ANDROID_LOG_DEBUG, "Debug", filename);
}

AAssetDir_close(assetDir);

我也使用OSG。 我设置的图像作为纹理着色器我用下面的代码:

texture->setImage(osgDB::readImageFile(fileNameWithPath));

但是,文件名必须包括绝对路径,以及因为它不位于同一目录中。 但是我发现我不能得到这些资产目录的绝对路径,是它与APK一起被压缩。

是,我无法访问的绝对路径,还有什么其他的方式可以我用得到的形象呢? 另外需要注意的,我也想保持这些文件的资产文件夹放在附近的SD卡。

Answer 1:

你可以阅读从资产图像AAssetManager_openAAsset_read ,但由于资产位于APK你不能为它取一个文件路径名-它也压缩在那里。 您可以将数据保存到一个文件,后来从该文件中读取或者你可以直接处理从您的资源文件了,如果OSG允许块。

从这里 :

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);


Answer 2:

一个更值得一提的是,Android的投入限制在可以在时间被读取,1MB的资产规模。 如果你的文件比这更大,你必须把它分割成块。 这里是一个加载文件块到矢量字符的我工作的解决方案:

AAssetManager * mgr = app->activity->assetManager; 
AAssetDir* assetDir = AAssetManager_openDir(mgr, "");

const char* filename;
std::vector<char> buffer;

while ((filename = AAssetDir_getNextFileName(assetDir)) != NULL) 
{
    //search for desired file
    if(!strcmp(filename, /* searched file name */)) 
    {
        AAsset *asset = AAssetManager_open(mgr, filename, AASSET_MODE_STREAMING);

        //holds size of searched file
        off64_t length = AAsset_getLength64(asset);
        //keeps track of remaining bytes to read
        off64_t remaining = AAsset_getRemainingLength64(asset);
        size_t Mb = 1000 *1024; // 1Mb is maximum chunk size for compressed assets
        size_t currChunk;
        buffer.reserve(length);

        //while we have still some data to read
        while (remaining != 0) 
        {
            //set proper size for our next chunk
            if(remaining >= Mb)
            {
                currChunk = Mb;
            }
            else
            {
                currChunk = remaining;
            }
            char chunk[currChunk];

            //read data chunk
            if(AAsset_read(asset, chunk, currChunk) > 0) // returns less than 0 on error
            {
                //and append it to our vector
                buffer.insert(buffer.end(),chunk, chunk + currChunk);
                remaining = AAsset_getRemainingLength64(asset);
            }
        }
        AAsset_close(asset);
    }

}


文章来源: How To Get File In Assets From Android NDK