我从资产中读取文本文件的内容。但是,如果我读取第二个文件,则会得到错误的结果。它与以前的文件混合在一起。
这是第一个文件,它被 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
知道我做错了什么吗?
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);