लघु जवाब
सं AFAIK मानचित्रण fread/AAssetManager को C++ fopen संभव नहीं है। और यदि यह संभवतः आपको संपत्ति फ़ोल्डर में फ़ाइलों तक सीमित कर देगा। हालांकि एक कामकाज है, लेकिन यह सीधा नहीं है।
लांग उत्तर
यह सी में zlib और libzip का उपयोग कर APK में कहीं भी किसी भी फ़ाइल का उपयोग करना संभव है ++। आवश्यकताएं: कुछ जावा, zlib और/या libzip (उपयोग की आसानी के लिए, तो यही है कि मैं किसके लिए बस गया)। आप यहां libzip प्राप्त कर सकते हैं: http://www.nih.at/libzip/
libzip को एंड्रॉइड पर काम करने के लिए कुछ tinkering की आवश्यकता हो सकती है, लेकिन कुछ भी गंभीर नहीं है।
चरण 1: जावा में 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 पासिंग ++/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;
}
मान लिया जाये कि आप अब एक एसटीडी है :: स्ट्रिंग के लिए पारित आपके एपीके स्थान के साथ और आपके पास 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 लेकिन यह काम किया जाता है। ज़िप परत को सारणीबद्ध करने के लिए इसे अपने स्वयं के फ़ाइल पढ़ने के फ़ंक्शन पर लपेटना बहुत आसान होना चाहिए।
चूंकि संपत्तियां फाइल नहीं हैं, इसलिए उत्तर "नहीं" है। संपत्ति ज़िप संग्रह में प्रविष्टियां हैं जो एपीके है। – CommonsWare
'टिस एक अच्छा बिंदु ... –
तकनीकी रूप से, चूंकि एक एपीके एक फैंसी ज़िप फ़ाइल से अधिक कुछ नहीं है, इसलिए एपीके में कहीं भी किसी भी फ़ाइल तक पहुंचना पूरी तरह से संभव है जैसे कि यह सी ++ में ज़िप फ़ाइल थी। हालांकि इसे * कुछ * जावा की आवश्यकता होती है, लेकिन केवल आपके एपीके इंस्टॉल स्थान प्राप्त करने के लिए। मुझे पता है कि एक तथ्य रीडिंग एक मुद्दा नहीं है, लेकिन मैंने कभी भी एपीके को लिखने की कोशिश नहीं की। – Erik