Скопируйте файл из ресурсов во внутреннюю память Android с помощью C ++ в 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: %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 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);

1

Решение

Все ресурсы приложения на платформе 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-х FileUtils::getInstance()->getDataFromFile(filePath) проверяет, имеет ли filePath путь к файлу APK, затем разархивируйте этот файл (если он есть в APK) или прочитайте его с устройства хранения (для других файлов).

Примечание: это решение НЕ является потокобезопасным

4

Другие решения

Как сказал @Selvin,
вам нужно передать объект AssetManager из Java в нативный слой через JNI.
Вот несколько примеров.

#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);
}
0

По вопросам рекламы [email protected]