如何从Android NDK获取资产中的文件

时间:2012-11-09 23:11:39

标签: android android-ndk openscenegraph

我正在尝试从本机端访问assets文件夹中的图像文件。现在我可以成功搜索assets文件夹及其子目录,找到我要查找的特定文件:

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卡。

1 个答案:

答案 0 :(得分:30)

您可以使用AAssetManager_open& AAsset_read,但由于资产位于apk中,因此无法获取文件路径名称 - 它也会在那里进行压缩。您可以将数据保存到文件中并稍后从该文件中读取,或者如果OSG允许,您可以直接处理从资产文件中获取的块。

来自here

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