2012-04-15 8 views
11

कॉपी करें मैं एंड्रॉइड में गेम इंजन बनाने के लिए अपने इंजन में शुद्ध सी ++ का उपयोग कर रहा हूं। कोई भी जावा फ़ाइल नहीं है। असल में यह एक ऐसा गेम है जिसे केवल बाहरी स्मृति में संग्रहीत किया जाना चाहिए। जब मैं अपने बाहरी एसडी कार्ड में एडीबी के माध्यम से मैन्युअल रूप से अपना एसेट डेटा ले जाता हूं तो गेम पहले से ही ठीक और स्थिर काम करता है।एसेट मैनेजर के बिना सीधे सी ++ में एंड्रॉइड एपीके संपत्ति डेटा एक्सेस करें और

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 जीबी होगी जो समझ में नहीं आता है। उस से अधिक जोरदार फ़ोल्डर दोबारा काम नहीं करता है और केवल छोटी डेटा फ़ाइलों के लिए जो बड़ी पैक फ़ाइलों का उपयोग करते समय संभव नहीं है। अनजिप सिस्टम का उपयोग करते समय फ़ाइलों को सीधे एपीके से एक्सेस किया जा सकता है और फिर मेरी रिसोर्स फाइलों को उज़िप कर सकते हैं, लेकिन इसलिए मुझे एपीके पथ को वैसे भी चुनना है।

तो मेरे सवालों का:

  1. कहां है फाइल सिस्टम पर apk में आस्तियों फ़ोल्डर?
  2. एपीके स्थान या निष्पादन योग्य
  3. को पुनर्प्राप्त करने के लिए कोड (सी ++) क्या होगा, क्या मैं इसे सामान्य फ़ाइल ओपन विधि से सीधे एक्सेस कर सकता हूं या केवल अगर मैं इसे अनपैक कर सकता हूं। अगर मैं इसे बिना अनपॅक किए इस्तेमाल कर सकता हूं, तो कैसे?
  4. एसडी कार्ड घुड़सवार होने पर जानकारी को पुनर्प्राप्त करने के लिए कोड (सी ++) क्या होगा?

मुझे आशा है कि किसी ने मुझे :)

संपादित करने में मदद कर सकते हैं: जोड़ा कैश निर्देशिका और पैकेज निर्देशिका कोड (और यह उत्पादन पथ है) बाकी सब लोग इसे जरूरत के लिए स्रोत प्रदान करने के लिए,।

+0

एंड्रॉइड के मूल कार्यान्वयन के कुछ संस्करणों में एक बग के कारण एनडीके पक्ष से संपत्तियां प्राप्त करना मुश्किल और अविश्वसनीय है। मुझे उस एनएफओ को खोजने दें और आपको वापस मिलें। –

+0

यदि आप मूल सक्रियता का उपयोग करने पर झुक नहीं रहे हैं, तो आप एपीके और लोडिंग संपत्तियों को ढूंढने के लिए इस विधि (केवल भविष्य के संदर्भ के लिए) का उपयोग कर सकते हैं। http://androgeek.info/?p=275 –

+0

हाय, मैं इस प्रश्न का उपयोग इस प्रश्न में करने का प्रयास कर रहा हूं। मुझे .apk फ़ाइल और आंतरिक निर्देशिका पथ के लिए "getPackageCodePath" पथ प्राप्त करने की आवश्यकता है। लेकिन यह मुझे कॉल नहीं कर सकता त्रुटि की फेंक रहा है। कोई मुझे मदद कर सकता है ?? अग्रिम में धन्यवाद। मुख्य गतिविधि में मेरे पास है: सार्वजनिक देशी int परीक्षण(); और पुस्तकालय लोड करें। सी कोड में मैं जेएनआई विधि को कॉल कर रहा हूं और उसी के लिए "पैकेज कोड पथ" दिया गया है। एपीके: – RKosamia

उत्तर

3

मैं इसे डुप्लिकेट के रूप में चिह्नित करने के बजाय उत्तर पोस्ट कर रहा हूं क्योंकि तकनीकी रूप से, आप यहां प्रश्न/उत्तर में दिए गए प्रश्नों के मुकाबले अधिक जानकारी मांग रहे हैं। तो, अपने 4 अंक के पहले जवाब देने के लिए, Obtaining the name of an Android APK using C++ and the NativeActivity class देखें।

यह देखने के लिए कि एसडी कार्ड घुड़सवार है या नहीं, बल्कि यह बस होना चाहिए। बस एसडीकार्ड पर निर्देशिका या फ़ाइल खोलने का प्रयास करें (जिसे आप जानते हैं वहां होना चाहिए) और यदि यह विफल हो जाता है, तो आप जानते हैं कि एसडी कार्ड उपलब्ध नहीं है। What's the best way to check if a file exists in C? (cross platform) देखें।

+0

पर कॉल करने के लिए जानकारी के लिए Thx, इसके लिए इतनी देर तक पहुंचा लेकिन लिंक 2 में यह पोस्ट नहीं मिला! जानकारी के साथ मैं अंततः एपीके के स्थान को पुनः प्राप्त कर सकता था :) लिंक को एक से अलग फॉर्म में प्रदान करने के लिए पहले पोस्ट में कोड जोड़ा गया। फाइलों की जांच ठीक है, लेकिन मैंने सोचा कि एसडी कार्ड को सी कोड में आरोहित किया गया है, यह जांचने के लिए कुछ तरीका हो सकता है: 'android.os.Environment.getExternalStorageState()। बराबर (android.os.Environment.MEDIA_MOUNTED) ; जैसा कि [लिंक] में देखा गया है (http://stackoverflow.com/questions/902089/how-to-tell-if-the-sdcard-is-mounted-in-android) – odbb

2

आप "विस्तार फ़ाइलें" पर एक नज़र रखना चाहते हैं APK Expansion Files देखें।

जहाँ तक मैं इसे समझता हूं, यह आपको एक प्रणाली देता है जो स्वचालित रूप से "साझा भंडारण स्थान" पर संसाधन फ़ाइलों (आपकी विस्तार फ़ाइल) डालता है।

तो मुझे लगता है कि यह डुप्लिकेट डेटा की आपकी समस्या का समाधान करेगा।

एक संक्षिप्त परिचय post on the android-developers blog भी है।

+0

मुझे नहीं पता था कि एक है 50 एमबी की सीमा !!! एपीके फ़ाइल आकार पर? यह भयानक है और उन विस्तार फ़ाइलों को समस्या का समाधान हो सकता है, लेकिन odb फ़ाइलों तक पहुंच प्राप्त करने के लिए सी/सी ++ में AStorageManager का उपयोग करने के लिए फिर से कोई स्रोत है? लगता है कि देशी सी में डाउनलोडर सामान को फिर से कार्यान्वित करने के लिए बहुत सारे काम होते हैं: / – odbb

संबंधित मुद्दे