Android

[Native C++] 응용1. Assets을 이용한 aar 만들기 (2)

별빛의온기 2022. 10. 29. 11:14
반응형

 

Assets 폴더를 만들고 자료를 넣었으면 이를 활용하기 위한 Assets 관련 소스를 import하겠습니다.

 

1. 프로젝트의 cpp 폴더에 다음과 같은 소스파일을 넣습니다.

 

- android_fopne.cpp

#include <stdio.h>

#include "android_fopen.h"
#include <errno.h>
#include <android/asset_manager.h>


static int android_read(void *cookie, char *buf, int size) {
    return AAsset_read((AAsset *) cookie, buf, size);
}

static int android_write(void *cookie, const char *buf, int size) {
    return EACCES; // can't provide write access to the apk
}

static fpos_t android_seek(void *cookie, fpos_t offset, int whence) {
    return AAsset_seek((AAsset *) cookie, offset, whence);
}

static int android_close(void *cookie) {
    AAsset_close((AAsset *) cookie);
    return 0;
}
// must be established by someone else...
AAssetManager *android_asset_manager;
void android_fopen_set_asset_manager(AAssetManager *manager) {
    android_asset_manager = manager;
}


FILE *android_fopen(const char *fname, const char *mode) {
    if (mode[0] == 'w') return NULL;

    AAsset *asset = AAssetManager_open(android_asset_manager, fname, 0);
    if (!asset) return NULL;

    return funopen(asset, android_read, android_write, android_seek, android_close);

}
 

- android_fopen.h

#ifndef SAMPLEPROJECT_ANDROID_FOPNE_H
#define SAMPLEPROJECT_ANDROID_FOPNE_H

#include <stdio.h>
#include <android/asset_manager.h>


void android_fopen_set_asset_manager(AAssetManager* manager);
#ifdef __cplusplus
extern "C"{
#endif
FILE *android_fopen(const char *fname, const char *mode);

#ifdef __cplusplus
}
#endif
#define assets_fopen(name, mode) android_fopen(name, mode)

#endif //SAMPLEPROJECT_ANDROID_FOPNE_H
 

그리고 동기화를 진행합니다.

 

2. 프로젝트에 NDK 경로를 추가합니다.

 

local.properties를 클릭하고 아래를 추가합니다.  
ndk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk\\ndk-bundle

 

 

빌드 후 File에서 Project Structure...를 클릭합니다.

 

 

정상적으로 경로가 추가되었음을 확인 할 수 있습니다.

 

3. CMakeLists.txt에 새로 추가한 android_fopen.cpp와 android_fopen.h를 추가합니다. 그 후 빌드하고 동기화를 진행합니다.

 

동기화를 진행하면 에러가 사라진다.

 

 

반응형