2012-05-02 55 views
10

從資產文件夾中讀取文本文件我需要從android中的資產文件夾中讀取文本文件,通過搜索互聯網我發現從android 2.3開始有asset_manager api可用。由於我只針對平板電腦設備,所以這很有用。但是因爲我不是C語言專家,所以我無法找到任何有關如何使用文件描述符讀/寫文件的示例。我發現採用FILE *(文件指針)Android使用C(ndk)

我的目標是解密從資產文件夾中的JS文件,它是用C加密 許多例子(用於固定的代碼),作爲js代碼是可見的,如果終端用戶 反編譯我的apk。因爲資產文件夾在zip文件裏面有可能嗎?

回答

31

這裏是我用來讀取Android的資產文件夾使用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); 

添加下面一行到我的Android.mk

# for native asset manager 
LOCAL_LDLIBS += -landroid 

代碼,不要忘了包括在源文件中

#include <android/asset_manager.h> 
+1

很好的回答!與Assimp協同工作以加載3D模型。首先,我像上面描述的那樣將一個文件加載到內存中,然後將緩衝區傳遞給aiImportFileFromMemory – j00hi

+0

你能幫我弄清楚你傳遞的文件名是從哪裏來的? – Nishant

+0

@Nishant你能想出如何傳遞文件名嗎? – re3el

2

實際上FILE *和「INT」描述符是等效和的fread/fwrite的/的fopen/FCLOSE是打開/關閉/讀/寫功能的對應物(功能是等效然而,後者是無-blocking)。

要想從「FILE *」「詮釋」你可以使用

int fileno(FILE* f); 

在頭和做的,你可以使用fdopen()

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

逆因此,使用或者更換的一切FILE *轉換爲int或只取其中一個樣本,並在讀取文件之前插入此轉換代碼。

+0

謝謝,讓我試試 –

+1

OK。這實際上與NDK無關,所以如果你在這裏發佈了一些C代碼,那麼你就會遇到麻煩,社區將能夠更好地幫助你。祝你好運:)編碼:) –

2

它和普通的fread/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); 

就是這樣。它非常簡單。

尋求也是類似的。只需查看函數聲明並閱讀參數名稱/描述。這將是顯而易見的。