2012-05-02 33 views
10

アンドロイドのアセットフォルダからテキストファイルを読み込む必要があります。インターネット経由で検索すると、アンドロイド2.3以降で利用できるasset_manager apiが見つかりました。私がタブレットデバイスだけをターゲットにしているので、これは便利です。しかし、私はC言語の専門家ではないので、私はファイル記述子を使ってファイルを読み書きする方法の例を見つけることができません。私は、エンドユーザー 場合jsのコードが表示されているとして私の目標は、(コードを確保するための)Cを使用して を暗号化された資産フォルダからJSファイルを復号化するためにあるFILE *を使用して多くの例(ファイルポインタ)AndroidはC(ndk)を使用してアセットフォルダからテキストファイルを読み込みます

を見つけました私のAPKを逆コンパイルしました。アセットフォルダはZIPファイル内にあるのでできますか?

答えて

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

素晴らしい答え! Assimpと連動して私のために働き、3Dモデルを読み込みます。まず、上記のようにファイルをメモリにロードしてから、バッファをaiImportFileFromMemoryに渡します。 – j00hi

+0

ファイル名をどこに渡したのかわかりますか? – Nishant

+0

@Nishantファイル名を渡す方法を理解できますか? – re3el

2

実際(関数は等価ないが、後者は非あり*ファイルと「INT」記述子は同等であり、関数fread/fwriteの/のfopen/FCLOSEオープン/クローズ/読み出し/書き込み機能の対応物であります-ブロッキング)。

あなたはヘッダに

int fileno(FILE* f); 

を使用することができますし、(fdopenを使用することができます逆を行うために「ファイル*」から「INT」を取得するには)

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

ので、いずれかを使用して、すべてを置き換えますFILE *をintに変換するか、サンプルの1つを取り出し、この変換コードをファイルの読み込み前に挿入します。

+0

ありがとう、試してみましょう –

+1

OK。それは実際にはNDKとは関係がないので、あなたが問題を抱えているCコードをここに掲示すれば、コミュニティはあなたをより良く助けることができます。コーディングで幸運: –

2

通常のfread/fseek関数とよく似ています。 ここで読んだ機能declaraton:

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

それはfdファイルディスクリプタから読み込むbufにバッファcountバイト。あなたが関数freadを考える場合には、代わりに:

read(fd, buf, count*size); 

をそして、それはそれだ:

fread(buf, count, size, file); 

あなたが呼び出します。それはとても簡単です。

シークも同様です。関数の宣言を調べ、引数の名前/説明を読んでください。それは明らかです。ここで

関連する問題