2012-05-02 11 views
10

का उपयोग कर संपत्ति फ़ोल्डर से एंड्रॉइड पढ़ने वाली टेक्स्ट फ़ाइल को इंटरनेट के माध्यम से खोज करके मुझे एंड्रॉइड में संपत्ति फ़ोल्डर से टेक्स्ट फ़ाइल पढ़ने की आवश्यकता है, मैंने पाया कि एंड्रॉइड 2.3 के बाद से परिसंपत्ति_मैनेजर एपीआई उपलब्ध है। चूंकि मैं केवल टैबलेट डिवाइस को लक्षित कर रहा हूं यह उपयोगी है। लेकिन चूंकि मैं सी भाषा में विशेषज्ञ नहीं हूं, इसलिए मैं फाइल डिस्क्रिप्टर का उपयोग करके फ़ाइलों को पढ़ने/लिखने के बारे में कोई उदाहरण नहीं ढूंढ पा रहा हूं। के रूप में जे एस कोड दिख रहा है मैं, फ़ाइल * (फ़ाइल संकेत)सी (ndk)

मेरा लक्ष्य जो एन्क्रिप्टेड है सी का उपयोग कर संपत्ति फ़ोल्डर से एक जे एस फ़ाइल को डिक्रिप्ट करने के लिए है का उपयोग करते हुए कई उदाहरण (कोड हासिल करने के लिए) में पाया गया कि अगर अंत उपयोगकर्ता मेरे एपीके decompiled। क्योंकि संपत्ति फ़ोल्डर ज़िप फ़ाइल के अंदर है, क्या यह संभव है?

उत्तर

31

यहाँ कोड मैं अपने Android.mk

# for native asset manager 
LOCAL_LDLIBS += -landroid 

का उपयोग कर फ़ोल्डर asset_manager NDK lib

AAssetManager* mgr = AAssetManager_fromJava(env, assetManager); 
    AAsset* asset = AAssetManager_open(mgr, (const char *) js, AASSET_MODE_UNKNOWN); 
    if (NULL == asset) { 
     __android_log_print(ANDROID_LOG_ERROR, NF_LOG_TAG, "_ASSET_NOT_FOUND_"); 
     return JNI_FALSE; 
    } 
    long size = AAsset_getLength(asset); 
    char* buffer = (char*) malloc (sizeof(char)*size); 
    AAsset_read (asset,buffer,size); 
    __android_log_print(ANDROID_LOG_ERROR, NF_LOG_TAG, buffer); 
    AAsset_close(asset); 

जोड़ा निम्न पंक्ति एंड्रॉयड परिसंपत्तियों से फ़ाइल को पढ़ने के लिए इस्तेमाल किया है और भूल नहीं है को शामिल स्रोत फ़ाइल

#include <android/asset_manager.h> 
+1

महान उत्तर! 3 डी मॉडल लोड करने के लिए असिंप के साथ संयोजन के लिए मेरे लिए काम करता है।सबसे पहले, मैं ऊपर वर्णित स्मृति में एक फ़ाइल लोड करता हूं, फिर मैं बफर को AiImportFileFromMemory – j00hi

+0

पर पास करता हूं क्या आप यह जानने में मेरी सहायता कर सकते हैं कि आपने फ़ाइल नाम कहां पास किया था? – Nishant

+0

@ निशांत क्या आप फ़ाइल नाम को पास करने का तरीका समझ सकते हैं? – re3el

2

व्यावहारिक रूप से फ़ाइल * और 'int' वर्णनकर्ता बराबर हैं और fread/fwrite/fopen/fclose हैं खोलने/बंद/पठन/लेखन कार्यों में से समकक्षों (कार्यों तथापि बराबर नहीं हैं, बाद गैर हैं -blocking)।

से 'फ़ाइल *' 'int' आप शीर्षक में

int fileno(FILE* f); 

उपयोग कर सकते हैं और उलटा आप

FILE *fdopen(int fd, const char *mode); 

fdopen उपयोग कर सकते हैं() करने के लिए प्राप्त करने के लिए तो या तो का उपयोग कर सब कुछ की जगह फ़ाइल * int या बस नमूनों में से एक ले लो और फ़ाइल पढ़ने से पहले इस रूपांतरण कोड डालें।

+0

धन्यवाद, मुझे –

+1

ठीक करने का प्रयास करें। इसका वास्तव में एनडीके के साथ कुछ लेना देना नहीं है, इसलिए यदि आप यहां कुछ सी कोड पोस्ट करते हैं, जिसमें आपको परेशानी हो रही है, तो समुदाय आपको बेहतर मदद करने में सक्षम होगा। कोडिंग के साथ शुभकामनाएं :) –

2

यह नियमित रूप से फ़्रेड/fseek फ़ंक्शंस के समान ही है। यहाँ पढ़ रहा है समारोह declaraton:

ssize_t read(int fd, void *buf, size_t count); 

यह fd फ़ाइल वर्णनकर्ता से पढ़ता buf में बफर count बाइट्स। आप तो बजाय, fread के बारे में सोचते हैं:

fread(buf, count, size, file); 

आपको कॉल करेगा:

read(fd, buf, count*size); 

और बस हो गया। यह बहुत आसान है।

तलाश भी समान है। बस फ़ंक्शन घोषणा देखें और तर्क नाम/विवरण पढ़ें। यह स्पष्ट होगा।

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