係Android游戲唔將游戲資源擺係『res』而係『assets』, 事因『res』限制層次結構, 而『assets』允許任意檔案資料夾層次結構.位於『assets』檔案只讀唔寫. NDK需android 9版先支持.
係『CMakeLists.txt』添加『libandroid.so』庫
CMakeLists.txt |
find_library( Android-lib libandroid.so ) |
target_link_libraries( geomanticcompass
${OpenGL-lib} ${OpenEGL-lib} ${Android-lib} ${log-lib}) |
係c檔案加入頭檔
#include <android/asset_manager.h> |
#include <android/asset_manager_jni.h> |
『assets』檔通過『AssetManager』訪問
AssetManager assetManager = this.getAssets(); |
係『NDK』『assets』檔通過『AAssetManager』訪問, 『AAssetManager』接口
AAssetManager* AAssetManager_fromJava(JNIEnv* env, jobject assetManager); |
將『AssetManager』傳過去獲得『AAssetManager』
extern “C”
JNIEXPORT void JNICALL Java_net_bookcard_geomanticcompass_MainActivity_init(JNIEnv *env, jobject thiz, jobject egl_config, jobject asset_manager) { AAssetManager *assetManager= AAssetManager_fromJava(env, asset_manager); } |
public native void init(AssetManager asset_manager); |
init (getAssets()); |
開啟『assets』檔, 冇需畀絕對路徑, 而係畀『assets』相對路俓
AAsset *asset = AAssetManager_open(nativeasset, “name.bmp”, AASSET_MODE_BUFFER); |
檔长度
int size = AAsset_getLength(asset) |
分配記憶體
PBYTE data = (PBYTE)malloc(size); |
讀『assets』檔
AAsset_read(asset, data, size); |
載入分析
Load(data, size); |
释放记忆体
free(data); |
閂『assets』檔
AAsset_close(asset); |
將游戲資源擺係『assets』下,『assets』『res』同位於『app\src\main』之下.
檔案資料夾 | 位置 |
assets | D:\Android\game\app\src\main\assets |
cpp | D:\Android\game\app\src\main\cpp |
java | D:\Android\game\app\src\main\java |
res | D:\Android\game\app\src\main\res |