简短的回答

不可以。在C ++中使用AFAIK映射fread / fopen到AAssetManager是不可能的。 如果它可能会限制您在assets文件夹中的文件。 然而,有一个解决方法,但它并不简单。

答案很长

它可以使用zlib的和libzip在C ++中的APK随时随地访问任何文件。 要求:一些java,zlib和/或libzip(为了便于使用,所以这就是我的目标)。 你可以在这里获得libzip: http ://www.nih.at/libzip/

libzip可能需要一些修补才能让它在android上运行,但没什么大不了的。

第1步:在Java中检索APK位置并传递给JNI / C ++

String PathToAPK;

ApplicationInfo appInfo = null;

PackageManager packMgmr = parent.getPackageManager();

try {

appInfo = packMgmr.getApplicationInfo("com.your.application", 0);

} catch (NameNotFoundException e) {

e.printStackTrace();

throw new RuntimeException("Unable to locate APK...");

}

PathToAPK = appInfo.sourceDir;

将PathToAPK传递给C ++ / JNI

JNIEXPORT jlong JNICALL Java_com_your_app(JNIEnv *env, jobject obj, jstring PathToAPK)

{

// convert strings

const char *apk_location = env->GetStringUTFChars(PathToAPK, 0);

// Do some assigning, data init, whatever...

// insert code here

//release strings

env->ReleaseStringUTFChars(PathToAPK, apk_location);

return 0;

}

假设您现在有一个带有APK位置的std :: string,并且您在libzip上运行了zlib,您可以执行以下操作:

if(apk_open == false)

{

apk_file = zip_open(apk_location.c_str(), 0, NULL);

if(apk_file == NULL)

{

LOGE("Error opening APK!");

result = ASSET_APK_NOT_FOUND_ERROR;

}else

{

apk_open = true;

result = ASSET_NO_ERROR;

}

}

并从APK中读取文件:

if(apk_file != NULL){

// file you wish to read; **any** file from the APK, you're not limited to regular assets

const char *file_name = "path/to/file.png";

int file_index;

zip_file *file;

struct zip_stat file_stat;

file_index = zip_name_locate(apk_file, file_name, 0);

if(file_index == -1)

{

zip_close(apk_file);

apk_open = false;

return;

}

file = zip_fopen_index(apk_file, file_index, 0);

if(file == NULL)

{

zip_close(apk_file);

apk_open = false;

return;

}

// get the file stats

zip_stat_init(&file_stat);

zip_stat(apk_file, file_name, 0, &file_stat);

char *buffer = new char[file_stat.size];

// read the file

int result = zip_fread(file, buffer, file_stat.size);

if(result == -1)

{

delete[] buffer;

zip_fclose(file);

zip_close(apk_file);

apk_open = false;

return;

}

// do something with the file

// code goes here

// delete the buffer, close the file and apk

delete[] buffer;

zip_fclose(file);

zip_close(apk_file);

apk_open = false;

不完全是fopen / fread,但它完成了工作。 将它包装到您自己的文件读取函数中以抽象zip层非常容易。