Checking if directory (folder) exists in apk via native code only

我的梦境 提交于 2020-01-02 10:23:39

问题


I need to check wether a certain directory exists in apk.

The android/asset_manager.h api seems to be inconsistent - it returns NULL when AAsset* AAssetManager_open(AAssetManager* mgr, const char* filename, int mode); fails to open a file, but for directories AAssetDir* AAssetManager_openDir(AAssetManager* mgr, const char* dirName);'s implementation always returns a new AAssetDir(...), even if internally it failed to open/find the directory in apk.

It is quite irritating that AAssetDir is forward-declared and it's implementation is hidden away in the .cpp file, otherwise it would've been (maybe?)possible to check the internal AssetDir object for validity.

There is another option I am exploring right now - to call java and do something like:

public static boolean folderExistsInApk(final String path){
    AssetManager assetManager = activity.getAssets();
    try{
        //if .list would fail, it would throw IOException
        //which would signal that there is no such directory
        assetManager.list(path);
    }catch(Exception e){
        return false;
    }
    return true;
}

But it seems "dirty" to me, and it would definitely be pretty slow (which isn't a big factor in my specific code, but still - avoiding unnecessary pessimisation is good coding practice).

Have I missed something? Is it possible to check if directory exists in apk via native code only? If not - how to best do it with jni?


回答1:


Following code allows to check if certain folder exists in apk bundle:

#include <android/asset_manager.h>

bool directoryExists(jobject assetManager, const std::string& path){
    auto assetDir = AAssetManager_openDir( assetManager, path.c_str() );
    bool r = AAssetDir_getNextFileName(assetDir) != NULL;
    AAssetDir_close( assetDir );
    return r;
}

AAsetManager_openDir will always return a pointer to initialized object, even if the specified directory doesn't exist. In other words, checking if assetDir==NULL is pointless. Trick is to check if AAssetDir_getNextFileName will return a non-null const char *. If it's NULL - there is no folder, else - there is one.

Important notice: if a folder is empty, but for some reason you need to know if it exists in apk, that code would be useless due to the way it checks folder existance. But AFAIK empty folders aren't copied to apk, so such situation is improbable.



来源:https://stackoverflow.com/questions/26101371/checking-if-directory-folder-exists-in-apk-via-native-code-only

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!