安卓资产和NDK

7
我正在尝试从本地代码中读取一个简单的文本文件。
  1. I placed file.txt under assets folder
  2. In my activity I'm creating asset manager: assetManager = getAssets(); Then I'm passing the assetManager to my native method and(as in the native audio example):

    AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
    AAsset* asset = AAssetManager_open(mgr, "file.txt", AASSET_MODE_UNKNOWN);
    AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
    
    off_t start, length;
    
    int fd = AAsset_openFileDescriptor(asset, &start, &length);   
    
问题是fd小于0!!!
有人能帮忙解决吗?
1个回答

7

AAsset_openFileDescriptor 仅适用于非压缩文件 (如 mp3,jpg,png 等...)。这在文档 (asset_manager.h 头文件) 中有说明。

/**
 * Open a new file descriptor that can be used to read the asset data.
 *
 * Returns < 0 if direct fd access is not possible (for example, if the asset is
 * compressed).
 */
int AAsset_openFileDescriptor(AAsset* asset, off_t* outStart, off_t* outLength);

请使用AAsset_readAAsset_getBuffer

1
谢谢。所以它默认压缩文本文件? - nmnir
很抱歉要重新推荐,但我确实需要文件描述符,那么使用AAsset_read或AAsset_getBuffer解压缩文件的方式是什么? - nmnir
APK文件是ZIP文件。因此,它包含的大多数文件(包括assets子目录中的文件)都是压缩的。只有像mp3、jpeg、png和其他几个特定的文件没有被压缩。 - Mārtiņš Možeiko
1
对于压缩文件,您无法获取文件描述符。如果您正在使用ant任务构建apk,则可以修改aapt构建任务以从压缩中排除具有特定扩展名的文件:https://dev59.com/ZFnUa4cB1Zd3GeqPbY_o 当然,这样您的apk文件将会更大。 - Mārtiņš Možeiko
谢谢。有没有一种方法可以配置Eclipse的apk构建器? - nmnir
如果您有一个模型的 .obj 文件,您需要确保它没有被压缩,我也遇到过这种情况。 - FrickeFresh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接