使用c+将文件从资产复制到android的内部内存+;在cocos2dx中
我正在开发cocos2dx版本3.0-alpha0 我想将assets文件夹中的txt复制到android设备的内存中 到目前为止我有使用c+将文件从资产复制到android的内部内存+;在cocos2dx中,android,c++,android-ndk,cocos2d-x,cocos2d-x-3.0,Android,C++,Android Ndk,Cocos2d X,Cocos2d X 3.0,我正在开发cocos2dx版本3.0-alpha0 我想将assets文件夹中的txt复制到android设备的内存中 到目前为止我有 ` string originalPath = FileUtils::getInstance()->fullPathForFilename("example.txt"); string dbPath = FileUtils::getInstance()->getWritablePath(); dbPath.append("exam
` 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来说。从资产中获取文件并不是那么容易
在android ndk中,我们有asset_manager.h
但我不知道如何与一个。
我发现了一些有用的链接,但不知道如何初始化这些链接中的内容
这里还有一个类似的问题
但是我不知道怎么去找经理
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-xFileUtils::getInstance()->getDataFromFile(filePath)
检查filePath是否为APK资产路径,然后解压缩此文件(如果在APK中)或从存储设备读取(对于其他文件)
注意:此解决方案不是线程安全的,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-xFileUtils::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);
}
#包括
#包括
助理经理*经理;
void Java_pe_berabue_ex_GLView_nativeCreated(JNIEnv*env,jclass cls,jobject assetManager)
{
char*buf;
int文件大小;
mgr=AAssetManager_fromJava(GetEnv(),assetManager);
AAsset*asset=AAssetManager_open(mgr,“tmp.txt”,AAsset_MODE_未知);
如果(资产==NULL)
回来
fileSize=AAsset\u getLength(资产);
如果(文件大小==0)
回来
buf=(char*)malloc(sizeof(char)*文件大小);
AAsset_read(资产、基本单位、文件大小);
AAsset_close(资产);
}
正如@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);
}
#包括
#包括
助理经理*经理;
void Java_pe_berabue_ex_GLView_nativeCreated(JNIEnv*env,jclass cls,jobject assetManager)
{
char*buf;
int文件大小;
mgr=AAssetManager_fromJava(GetEnv(),assetManager);
AAsset*asset=AAssetManager_open(mgr,“tmp.txt”,AAsset_MODE_未知);
如果(资产==NULL)
回来
fileSize=AAsset\u getLength(资产);
如果(文件大小==0)
回来
buf=(char*)malloc(sizeof(char)*文件大小);
AAsset_read(资产、基本单位、文件大小);
AAsset_close(资产);
}
从(内部)本机活动(ANativeActivity
)或从javaAssetManager
对象从java传递到jni代码我有一个cpp文件我希望从(内部)本机活动(ANativeActivity
)中获得资产文件或者从javaAssetManager
对象传递到jni代码我有一个cpp文件,我希望资产文件在那里