Android c++ AAsset_read 读取错误数据

问题描述 投票:0回答:1

我从资产中读取文本文件的内容。但是,如果我读取第二个文件,则会得到错误的结果。它与以前的文件混合在一起。

这是第一个文件,它被 AAsset_read 正确写入缓冲区:

uniform   mat4 uMVPMatrix;

attribute vec4 vPosition;
attribute vec4 a_Color;

varying vec4 v_Color;

void main() 
{ 
   gl_Position = uMVPMatrix * vPosition;
   v_Color = a_Color;
}

这是第二个文件,这就是它的实际外观,预计将被写入缓冲区:

precision mediump float; 

varying vec4 v_Color;
uniform float alpha;
 
void main() 
{ 
    gl_FragColor = v_Color;
    gl_FragColor.a = gl_FragColor.w * alpha;
}

但是,这是 AAsset_read 写入缓冲区的内容。它添加了“v_Color = a_Color; }“”在最后,这是第一个文件内容的一部分。

"precision mediump float; \n\nvarying vec4 v_Color;\nuniform float alpha;\n \nvoid main() \n{ \n    gl_FragColor = v_Color;\n    gl_FragColor.a = gl_FragColor.w * alpha;\n}v_Color = a_Color;\n}"

这是我使用的方法:

std::string Assets::getTextFile(const char *file) {
        AAsset *asset = AAssetManager_open(android_assetManager, file, AASSET_MODE_UNKNOWN);

        int size = AAsset_getLength(asset);       
        char *bits = new char[size];

        AAsset_read(asset, bits, size);
        AAsset_close(asset);

        std::string a(bits);

        return a;
}

我使用的是android 13,ndk是24.0.8215888

知道我做错了什么吗?

android c++ android-ndk assets readfile
1个回答
0
投票

AAsset_read
的工作是从资产中读取字节,它NOT添加终止NUL字节。 您应该告诉
std::string
构造函数确切的大小:

std::string a(bits, size);

你又忘了释放

bits
。您可以通过将
AAsset_read
将其数据直接放入字符串并跳过额外的副本来改进代码。

std::string ret(size, 0);
AAsset_read(asset, ret.data(), size);
© www.soinside.com 2019 - 2024. All rights reserved.