在cocos2dx中使用c++从资源复制文件到android内存
Copy a file from assets to internal memory of android using c++ in cocos2dx
我正在开发cocos2dx 3.0-alpha0版本。
我想复制一个文本,是目前在资产文件夹到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: %lunn",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的情况下。从资产中获取文件并不那么容易。
在android ndk中我们有asset_manager.h
但是我不知道怎么用。我发现了一些有用的链接,但不知道如何初始化那些东西。
http://en.wikibooks.org/wiki/OpenGL_Programming/Android_GLUT_Wrapper Accessing_assets
这是另一个类似的问题
如何从Android NDK获取文件资源
但我不知道如何得到经理
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中)或从存储设备读取(对于其他文件)
注意:这个解决方案不是线程安全的
正如@Selvin所说,
你需要通过jni将AssetManager对象从java传递到本机层。下面是一些例子。
#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>
AAssetManager *mgr;
void Java_pe_berabue_ex_GLView_nativeCreated(JNIEnv * env, jclass cls, jobject assetManager)
{
char *buf;
int fileSize;
mgr = AAssetManager_fromJava(GetEnv(), assetManager);
AAsset* asset = AAssetManager_open(mgr, "tmp.txt", AASSET_MODE_UNKNOWN);
if ( asset == NULL )
return;
fileSize = AAsset_getLength(asset);
if ( fileSize == 0 )
return;
buf = (char *)malloc(sizeof(char)*fileSize);
AAsset_read(asset, buf, fileSize);
AAsset_close(asset);
}
相关文章:
- 如何使用位字段将数据从二进制文件复制到结构中?
- 将文件复制到自定义位置,存在字符串转换问题
- 无法将整个文本文件复制到字符数组
- 使用 Libssh 将文件从服务器复制到客户端:分配文件复制目标路径时出现问题
- 将文本从一个文件复制到另一个c++流时出错
- 如何检查文件复制和写入是否成功
- 将文件复制到 pro/pri 文件中的新目录
- C++可以从文本文件复制并粘贴到打开的Word程序中
- 如何使用 c++ 文件系统库将文件复制到另一个目录
- 将.bin输入文件复制到 linux 中
- CMake:将头文件复制到输出目录
- 如何将文件复制到另一个文件中,但是用用户输入的单词替换单词
- 仅将所需的数据从一个大文件复制到另一个大文件
- catkin_make无法创建可执行文件,并自动将标题文件复制到DEVEL
- QT-将文件复制到AppData
- 将文件复制到另一个目录不起作用
- 使用boost递归地将给定目录中每个最低级别文件夹的文件复制到另一个目录-C++
- 在 c++ 中将整个.txt文件复制到 char 数组中
- 将二进制文件复制到C++中的远程位置
- 我试图运行将文本从一个文件复制到另一个文件的程序