कॉपी करें मैं एंड्रॉइड में गेम इंजन बनाने के लिए अपने इंजन में शुद्ध सी ++ का उपयोग कर रहा हूं। कोई भी जावा फ़ाइल नहीं है। असल में यह एक ऐसा गेम है जिसे केवल बाहरी स्मृति में संग्रहीत किया जाना चाहिए। जब मैं अपने बाहरी एसडी कार्ड में एडीबी के माध्यम से मैन्युअल रूप से अपना एसेट डेटा ले जाता हूं तो गेम पहले से ही ठीक और स्थिर काम करता है।एसेट मैनेजर के बिना सीधे सी ++ में एंड्रॉइड एपीके संपत्ति डेटा एक्सेस करें और
adb push ..\..\Bin\Data /sdcard/Android/data/com.fantasyhaze.%SMALL_PACKAGE_NAME%/files/Data/
यह एक अच्छा समाधान नहीं है क्योंकि इसे वितरित नहीं किया जा सकता है। इसलिए मैं आस्तियों फ़ोल्डर में मेरी संपत्ति-डेटा जो निम्नलिखित संरचना के साथ प्रक्रिया के निर्माण के दौरान apk फ़ाइल में चले गए हो जाता है:
आस्तियों/डेटा/MoreFolders/Withsubfolders आस्तियों/डेटा/EngineData.zip आस्तियों/डेटा/ScriptData.zip
लेकिन मुझे नहीं पता कि फाइलें सिस्टम फ़ाइलों पर सी ++ कोड में उन्हें एक्सेस करने के लिए कहां हैं।
इसलिए मैंने फ़ाइल निर्देशिकाओं का मार्ग प्राप्त करने का प्रयास किया। और देशी गतिविधि स्थिति में एक बग की वजह से मुझे सामान्य कोड में जानकारी पुनर्प्राप्त करना है।
// bug in 2.3 internalDataPath/externalDataPath = null using jni code instead
//FHZ_PRINTF("INTERNAL inter PATH = %s\n", state->activity->internalDataPath);
//FHZ_PRINTF("EXTERNAL inter PATH = %s\n", state->activity->externalDataPath);
C++ ect android.os.Environment.getFilesDir() और android.os.Environment.getExternalStorageState (करने के लिए इसके समकक्ष)
// getPath() - java
JNIEnv *jni_env = Core::HAZEOS::GetJNIEnv();
jclass cls_Env = jni_env->FindClass("android/app/NativeActivity");
jmethodID mid_getExtStorage = jni_env->GetMethodID(cls_Env, "getFilesDir","()Ljava/io/File;");
jobject obj_File = jni_env->CallObjectMethod(gstate->activity->clazz, mid_getExtStorage);
jclass cls_File = jni_env->FindClass("java/io/File");
jmethodID mid_getPath = jni_env->GetMethodID(cls_File, "getPath","()Ljava/lang/String;");
jstring obj_Path = (jstring) jni_env->CallObjectMethod(obj_File, mid_getPath);
const char* path = jni_env->GetStringUTFChars(obj_Path, NULL);
FHZ_PRINTF("INTERNAL PATH = %s\n", path);
jni_env->ReleaseStringUTFChars(obj_Path, path);
// getCacheDir() - java
mid_getExtStorage = jni_env->GetMethodID(cls_Env,"getCacheDir", "()Ljava/io/File;");
obj_File = jni_env->CallObjectMethod(gstate->activity->clazz, mid_getExtStorage, NULL);
cls_File = jni_env->FindClass("java/io/File");
mid_getPath = jni_env->GetMethodID(cls_File, "getAbsolutePath", "()Ljava/lang/String;");
obj_Path = (jstring) jni_env->CallObjectMethod(obj_File, mid_getPath);
path = jni_env->GetStringUTFChars(obj_Path, NULL);
FHZ_PRINTF("CACHE DIR = %s\n", path);
jni_env->ReleaseStringUTFChars(obj_Path, path);
// getExternalFilesDir() - java
mid_getExtStorage = jni_env->GetMethodID(cls_Env,"getExternalFilesDir", "(Ljava/lang/String;)Ljava/io/File;");
obj_File = jni_env->CallObjectMethod(gstate->activity->clazz, mid_getExtStorage, NULL);
cls_File = jni_env->FindClass("java/io/File");
mid_getPath = jni_env->GetMethodID(cls_File, "getPath", "()Ljava/lang/String;");
obj_Path = (jstring) jni_env->CallObjectMethod(obj_File, mid_getPath);
path = jni_env->GetStringUTFChars(obj_Path, NULL);
FHZ_PRINTF("EXTERNAL PATH = %s\n", path);
jni_env->ReleaseStringUTFChars(obj_Path, path);
//getPackageCodePath() - java
mid_getPath = jni_env->GetMethodID(cls_Env, "getPackageCodePath", "()Ljava/lang/String;");
obj_File = jni_env->CallObjectMethod(gstate->activity->clazz, mid_getPath);
obj_Path = (jstring) jni_env->CallObjectMethod(obj_File, mid_getPath);
path = jni_env->GetStringUTFChars(obj_Path, NULL);
FHZ_PRINTF("Looked up package code path = %s\n", path);
के लिए कोड और
में परिणाम जो बहुत अच्छी तरह से काम करता हैइन्टरनल पथ = /data/data/com.fantasyhaze.rememory/files
कैश DIR = /data/data/com.fantasyhaze.rememory/cache
बाह्य पथ = /mnt/sdcard/Android/data/com.fantasyhaze.rememory/files
की खोज की पैकेज कोड पथ = /mnt/asec/com.fantasyhaze.rememory-2/pkg.apk
लेकिन संपत्ति फ़ोल्डर्स से कोई फाइल नहीं है ...
और मुझे फ़ाइलों को पढ़ने के लिए सामान्य कार्य निर्देशिका के रूप में फ़ोल्डर तक पहुंचने की आवश्यकता है। जो
में संभव होगा /mnt/sdcard/Android/data/com.fantasyhaze.rememory/files/Data
लेकिन इस फ़ोल्डर में संपत्ति प्रबंधक के माध्यम से संपत्ति फ़ोल्डर से सभी डेटा (जहां यह है) चलती , स्मृति की दोगुनी खपत का कारण बनता है।
संपत्ति> 1 जीबी का मतलब संपत्ति> 2 जीबी होगी जो समझ में नहीं आता है। उस से अधिक जोरदार फ़ोल्डर दोबारा काम नहीं करता है और केवल छोटी डेटा फ़ाइलों के लिए जो बड़ी पैक फ़ाइलों का उपयोग करते समय संभव नहीं है। अनजिप सिस्टम का उपयोग करते समय फ़ाइलों को सीधे एपीके से एक्सेस किया जा सकता है और फिर मेरी रिसोर्स फाइलों को उज़िप कर सकते हैं, लेकिन इसलिए मुझे एपीके पथ को वैसे भी चुनना है।
तो मेरे सवालों का:
- कहां है फाइल सिस्टम पर apk में आस्तियों फ़ोल्डर?
- एपीके स्थान या निष्पादन योग्य
- को पुनर्प्राप्त करने के लिए कोड (सी ++) क्या होगा, क्या मैं इसे सामान्य फ़ाइल ओपन विधि से सीधे एक्सेस कर सकता हूं या केवल अगर मैं इसे अनपैक कर सकता हूं। अगर मैं इसे बिना अनपॅक किए इस्तेमाल कर सकता हूं, तो कैसे?
- एसडी कार्ड घुड़सवार होने पर जानकारी को पुनर्प्राप्त करने के लिए कोड (सी ++) क्या होगा?
मुझे आशा है कि किसी ने मुझे :)
संपादित करने में मदद कर सकते हैं: जोड़ा कैश निर्देशिका और पैकेज निर्देशिका कोड (और यह उत्पादन पथ है) बाकी सब लोग इसे जरूरत के लिए स्रोत प्रदान करने के लिए,।
एंड्रॉइड के मूल कार्यान्वयन के कुछ संस्करणों में एक बग के कारण एनडीके पक्ष से संपत्तियां प्राप्त करना मुश्किल और अविश्वसनीय है। मुझे उस एनएफओ को खोजने दें और आपको वापस मिलें। –
यदि आप मूल सक्रियता का उपयोग करने पर झुक नहीं रहे हैं, तो आप एपीके और लोडिंग संपत्तियों को ढूंढने के लिए इस विधि (केवल भविष्य के संदर्भ के लिए) का उपयोग कर सकते हैं। http://androgeek.info/?p=275 –
हाय, मैं इस प्रश्न का उपयोग इस प्रश्न में करने का प्रयास कर रहा हूं। मुझे .apk फ़ाइल और आंतरिक निर्देशिका पथ के लिए "getPackageCodePath" पथ प्राप्त करने की आवश्यकता है। लेकिन यह मुझे कॉल नहीं कर सकता त्रुटि की फेंक रहा है। कोई मुझे मदद कर सकता है ?? अग्रिम में धन्यवाद। मुख्य गतिविधि में मेरे पास है: सार्वजनिक देशी int परीक्षण(); और पुस्तकालय लोड करें। सी कोड में मैं जेएनआई विधि को कॉल कर रहा हूं और उसी के लिए "पैकेज कोड पथ" दिया गया है। एपीके: – RKosamia