android: load prc files from assets. Move assets to /android_asset

This commit is contained in:
rdb 2018-02-17 20:07:58 +01:00
parent 8dea93bf38
commit 95eee0cab2
2 changed files with 36 additions and 2 deletions

View File

@ -7525,9 +7525,10 @@ def MakeInstallerAndroid():
continue
copy_library(source, base)
# Copy the models as well.
# Copy the models and config files to the virtual assets filesystem.
oscmd("mkdir apkroot/assets")
oscmd("cp -R %s apkroot/assets/models" % (os.path.join(GetOutputDir(), "models")))
oscmd("cp -R %s apkroot/assets/etc" % (os.path.join(GetOutputDir(), "etc")))
# Make an empty res folder. It's needed for the apk to be installable, apparently.
oscmd("mkdir apkroot/res")

View File

@ -133,7 +133,8 @@ void android_main(struct android_app* app) {
asset_mount = new VirtualFileMountAndroidAsset(app->activity->assetManager, apk_fn);
VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr();
Filename asset_dir(apk_fn.get_dirname(), "assets");
//Filename asset_dir(apk_fn.get_dirname(), "assets");
Filename asset_dir("/android_asset");
vfs->mount(asset_mount, asset_dir, 0);
// Release the apk_path.
@ -143,6 +144,33 @@ void android_main(struct android_app* app) {
//TODO: prevent it from adding the directory multiple times.
get_model_path().append_directory(asset_dir);
// Now load the configuration files.
vector<ConfigPage *> pages;
ConfigPageManager *cp_mgr;
AAssetDir *etc = AAssetManager_openDir(app->activity->assetManager, "etc");
if (etc != nullptr) {
cp_mgr = ConfigPageManager::get_global_ptr();
const char *filename = AAssetDir_getNextFileName(etc);
while (filename != nullptr) {
// Does it match any of the configured prc patterns?
for (size_t i = 0; i < cp_mgr->get_num_prc_patterns(); ++i) {
GlobPattern pattern = cp_mgr->get_prc_pattern(i);
if (pattern.matches(filename)) {
Filename prc_fn("etc", filename);
istream *in = asset_mount->open_read_file(prc_fn);
if (in != nullptr) {
ConfigPage *page = cp_mgr->make_explicit_page(Filename("/android_asset", prc_fn));
page->read_prc(*in);
pages.push_back(page);
}
break;
}
}
filename = AAssetDir_getNextFileName(etc);
}
AAssetDir_close(etc);
}
// Also read the intent filename.
methodID = env->GetMethodID(activity_class, "getIntentDataPath", "()Ljava/lang/String;");
jstring filename = (jstring) env->CallObjectMethod(activity->clazz, methodID);
@ -229,6 +257,11 @@ void android_main(struct android_app* app) {
android_cat.info() << "Destroy requested, exiting from android_main\n";
for (ConfigPage *page : pages) {
cp_mgr->delete_explicit_page(page);
}
vfs->unmount(asset_mount);
if (filename_str != nullptr) {
env->ReleaseStringUTFChars(filename, filename_str);
}