2011-01-19 17 views
14

क्या एसडी कार्ड की तुलना में कहीं और फाइल लिखने का कोई अन्य तरीका है?एंड्रॉइड एनडीके फ़ाइल लिखें

मैं फाइल सिस्टम पर कई अलग अलग पथ की कोशिश की, लेकिन हमेशा शून्य लौट fopen, किसी भी फाइल है कि मैं लिखने/अंदर पढ़ को छोड़कर/sdcard/...

वहाँ बराबर कुछ और करने के लिए है:

जो आपको फ़ाइल सिस्टम या कुछ पर लिखने की अनुमति देता है?

+0

इस लिंक में उत्तर दिया गया है: vgokul129

उत्तर

5

आपके पास अपने ऐप के भीतर से दो स्थानों तक पहुंच है, एसडीकार्ड और आपके ऐप के लिए एक विशेष डेटा निर्देशिका है। जब तक आपके पास रूट पहुंच न हो, तब तक कोई अन्य स्थान सीमा से बाहर है।

+0

उस "विशेष डेटा निर्देशिका" का स्थान कहां है ? Cuz मुझे लगता है कि सभी फोन में एक एसडीकार्ड नहीं है ... तो/sdcard/dir। विश्वसनीय नहीं है। टीआईए – bobmc

+1

आप ओएस से पूछ सकते हैं कि निर्देशिका निम्न आदेशों का उपयोग कर जावा में है: mContext.getFilesDir(); mContext.getExternalFilesDir (शून्य); आपको बड़ी वस्तुओं के लिए बाहरी संग्रहण का पक्ष लेना चाहिए क्योंकि डिवाइस में सीमित आंतरिक संग्रहण हो सकता है। – CaseyB

+0

मेरे पास डिवाइस तक रूट पहुंच है। क्या आप कृपया बता सकते हैं कि मैं फाइल सिस्टम का उपयोग कैसे कर सकता हूं। सिस्टम में फाइल खोलने की कोशिश कर रहा है मेरे लिए काम नहीं कर रहा है। कृपया यह जांचें [लिंक] (http://stackoverflow.com/questions/39785497/accessing-root-files-system-dev-from-a-native-library-in-android-applicatio) – Arjun

17
  1. आप हमेशा निर्देशिका को एक्सेस कर सकते हैं जिसमें आपका ऐप रखा गया है।

    इस निर्देशिका में आमतौर पर है:

    data/data/<Your_package_name_usually com.android.appName>/files/<your_filename>

    लेकिन बेहतर getFilesDir() करने के लिए उपयोग एंड्रॉयड के भविष्य संस्करण में परिवर्तन के साथ वैध filepath करता है।

  2. आप के बजाय बाह्य भंडारण का उपयोग करना चाहते हैं, तो आप अपने अनुप्रयोग लाभ अनुमति के लिए प्रकट में कोड के इस लाइन का ध्यान रखें। अन्यथा

    getExternalStorageDirectory(); //usually : /sdcard/<your_filename>

  3. , आप डिवाइस जड़ और पूरे फाइल सिस्टम में पहुँच प्राप्त कर सकते हैं:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    

    फिर sdcard निर्देशिका का उपयोग करें। लेकिन आपको अपने सभी ऐप उपयोगकर्ताओं को अपने डिवाइस पर से पहले अपने डिवाइस पर रूट पहुंच प्राप्त करने का अनुरोध करना होगा। कुछ गेम चीजों को करने के इस तरीके का उपयोग करते हैं, लेकिन मैं इसकी अनुशंसा नहीं करता। यदि आप अभी भी ऐसा करना चाहते हैं, तो एंड्रॉइड के लिए Superuser ऐप देखें, यह मुफ़्त है और भरोसेमंद है।

एक बार जब आप एंड्रॉयड निर्देशिका है, बस एक JNI देशी विधि है कि एक jstring पैरामीटर प्राप्त बनाते हैं, और आप इसे सेट अप अपने मूल कोड के अंदर। इसे एक std :: स्ट्रिंग में कनवर्ट करें, और आप इसे fopen() के साथ उपयोग करने के लिए तैयार होंगे।

//Inside your java activity 
File f = this.getApplicationContext().getFilesDir(); 
LibLoader.setupArchiveDir(f.toString()); 

//Inside your JNI wrapper 
JNIEXPORT bool JNICALL Java_com_android_appName_LibLoader_setupArchiveDir(JNIEnv * env, jobject obj, jstring dir) 
{ 
     const char* temp = env->GetStringUTFChars(dir, NULL); 
    std::string stringDir(temp); 

     // Will be receive as a std::string inside C++ code 
    MyNativeObjectInC++->SetupArchiveDir(stringDir); 
} 

संपादित करें:

आप manualy की जरूरत हो सकती पहली बार पर इसका इस्तेमाल करने में सक्षम होने से पहले सी में/फ़ाइलें बनाता है:

int result_code = mkdir("/data/data/com.app/files/", 0770)

चीयर्स !

+0

क्या झंडे '0770' में शामिल हैं अंतिम कोड नमूना में। 'mkdir ("/डेटा/डेटा/com.app/डेटाबेस ", S_IRWXU | S_IRWXG | S_IWOTH | S_IXOTH); 'मेरे लिए काम नहीं करता है :( – amin

-1

fopen(filePath, "a+") फ़ंक्शन का उपयोग करने से पहले फ़ाइल को बनाना होगा। या fopen(filePath, "a")

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