10

androidのアセットフォルダからテキストファイルを読み取る必要があります。インターネットで検索すると、android2.3以降で使用できるasset_managerapiがあることがわかりました。タブレットデバイスのみを対象としているので、これは便利です。しかし、私はC言語の専門家ではないため、ファイル記述子を使用してファイルを読み書きする方法の例を見つけることができません。FILE *(ファイルポインタ)を使った例をたくさん見つけました

私の目標は、Cを使用して暗号化されたアセットフォルダーからjsファイルを復号化することです(コードを保護するため)。エンドユーザーが私のapkを逆コンパイルするとjsコードが表示されるためです。アセットフォルダはzipファイル内にあるので可能ですか?

4

3 に答える 3

35

これは、asset_manager ndk libを使用してAndroidアセットフォルダーからファイルを読み取るために使用したコードです

    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>
于 2012-05-03T09:03:09.627 に答える
2

通常の fread/fseek 関数によく似ています。関数宣言の読み取りは次のとおりです。

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

fdファイル記述子からbufバッファcountバイトに読み込みます。あなたがfreadについて考えるなら、代わりに:

fread(buf, count, size, file);

あなたは電話します:

read(fd, buf, count*size);

以上です。とてもシンプルです。

シークも同様です。関数宣言を調べて、引数名/説明を読むだけです。それは明らかです。

于 2012-05-02T07:12:48.870 に答える
2

実際には、FILE* 記述子と 'int' 記述子は同等であり、fread/fwrite/fopen/fclose は open/close/read/write 関数に相当します (関数は同等ではありませんが、後者は非ブロッキングです)。

「FILE*」から「int」を取得するには、次を使用できます

int fileno(FILE* f);

ヘッダーで逆を行うには、 fdopen() を使用できます

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

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

于 2012-05-02T07:07:31.580 に答える