Android read text file from asset folder using C (ndk)

前端 未结 3 1332
广开言路
广开言路 2020-12-01 11:14

I need to read text file from asset folder in android, by searching through internet I found that there is asset_manager api available from android 2.3 onwards. As I am targ

相关标签:
3条回答
  • 2020-12-01 12:10

    Here is the code I used to read file from android assets folder using 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);
    

    Added following line to my Android.mk

    # for native asset manager
    LOCAL_LDLIBS    += -landroid
    

    And don't forget the include in source file

    #include <android/asset_manager.h>
    
    0 讨论(0)
  • 2020-12-01 12:10

    It's pretty similar to regular fread/fseek functions. Here's read function declaraton:

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

    It reads from fd file descriptor into buf buffer count bytes. If you think about fread, then instead of:

    fread(buf, count, size, file);
    

    you will call:

    read(fd, buf, count*size);
    

    And that's it. It is so simple.

    Seeking is also similar. Just look up the function declaration and read the argument names/description. It will be obvious.

    0 讨论(0)
  • 2020-12-01 12:13

    Practically FILE* and 'int' descriptors are equivalent and fread/fwrite/fopen/fclose are the counterparts of open/close/read/write functions (the functions are not equivalent however, the latter are non-blocking).

    To get 'int' from 'FILE*' you can use

    int fileno(FILE* f);
    

    in header and to do the inverse you can use fdopen()

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

    So either replace everything using the FILE* to int or just take one of the samples and insert this conversion code before the file reading.

    0 讨论(0)
提交回复
热议问题