gpt4 book ai didi

android - 在cocos2dx中使用c++将文件从 Assets 复制到android的内部存储器

转载 作者:行者123 更新时间:2023-11-30 01:54:10 27 4
gpt4 key购买 nike

我正在研究 cocos2dx 版本 3.0-alpha0。

我想将 Assets 文件夹中存在的 txt 复制到 android 设备的内部存储器。

到目前为止我有

`   string originalPath = FileUtils::getInstance()->fullPathForFilename("example.txt");
string dbPath = FileUtils::getInstance()->getWritablePath();
dbPath.append("example.txt");
FILE* source = fopen(originalPath.c_str(), "rb");

if (source!=NULL)
{
log("source example open");
}else{
log("source example not open");
}
FILE* dest = fopen(dbPath.c_str(), "wb");
if (dest!=NULL)
{
log("dest example open");
}else{
log("dest example not open");
}
unsigned long size2 = 0;
unsigned char* smth = FileUtils::getInstance()->getFileData(originalPath.c_str(), "r", &size2);
log("Size: %lu\n\n",size2);
log("size:%zu",fread(buf, size2, BUFSIZ, source));

// clean and more secure
// feof(FILE* stream) returns non-zero if the end of file indicator for stream is set

while ((size = fread(buf, 1, BUFSIZ, source))) {
fwrite(buf, 1, size, dest);
}

fclose(source);
log("establishConnection9");
fclose(dest);
log("establishConnection10");

`

在 ios 的情况下它工作正常但在 android 的情况下。从 Assets 中获取文件并不是那么容易。

在android ndk中我们有asset_manager.h

但我不知道如何使用它。我发现一些有用的链接,但不知道如何初始化这些链接。

http://en.wikibooks.org/wiki/OpenGL_Programming/Android_GLUT_Wrapper#Accessing_assets

这是另一个类似的问题

How To Get File In Assets From Android NDK

但是我不知道怎么得到mgr

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

最佳答案

Android 平台上的所有应用程序资源都存储在 APK 文件中(实际上是简单的 Zip 存档)。我们需要从 APK 中提取文件,然后将其保存到内部存储。 Cocos2d-x 已经拥有您需要的所有功能。

//First - get asset file data:
auto data = FileUtils::getInstance()->getDataFromFile(filePath);

//second - save it:
string dbPath = FileUtils::getInstance()->getWritablePath() + path;

FILE* dest = fopen(dbPath.c_str(), "wb");
fwrite(data.getBytes(), 1, data.getSize(), dest);
fclose(dest);

Cocos2d-x FileUtils::getInstance()->getDataFromFile(filePath) 检查 filePath 是否为 APK 资源路径,然后解压此文件(如果它在 APK 中)或从存储设备读取它(用于其他文件)。

注意:这个解决方案不是线程安全的

关于android - 在cocos2dx中使用c++将文件从 Assets 复制到android的内部存储器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22319359/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com