通过本机代码检查apk中是否存在目录(文件夹)

mr.*_*.pd 2 c++ android android-ndk native-activity

我需要检查apk中是否存在某个目录.

android/asset_manager.hAPI似乎是不一致的-当它返回NULL AAsset* AAssetManager_open(AAssetManager* mgr, const char* filename, int mode);无法打开文件,但目录AAssetDir* AAssetManager_openDir(AAssetManager* mgr, const char* dirName);的实现总是返回new AAssetDir(...),即使在内部它无法打开/找到的apk的目录.

AAssetDir前向声明并且它的实现隐藏在.cpp文件中是非常恼人的,否则它(可能?)可能检查内部AssetDir对象的有效性.

我现在正在探索另一个选项 - 调用java并执行以下操作:

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;
}
Run Code Online (Sandbox Code Playgroud)

但它对我来说似乎"脏",它肯定会很慢(这不是我特定代码中的一个重要因素,但仍然 - 避免不必要的悲观化是良好的编码实践).

我错过了什么吗?是否可以通过本机代码检查apk中是否存在目录?如果不是 - 如何最好地使用jni?

mr.*_*.pd 7

以下代码允许检查apk包中是否存在某个文件夹:

#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;
}
Run Code Online (Sandbox Code Playgroud)

AAsetManager_openDir将始终返回指向初始化对象的指针,即使指定的目录不存在也是如此.换句话说,检查是否assetDir==NULL毫无意义.诀窍是检查是否AAssetDir_getNextFileName返回非null const char *.如果它NULL- 没有文件夹,否则 - 有一个.

重要提示:如果文件夹为空,但由于某种原因您需要知道它是否存在于apk中,由于检查文件夹存在的方式,该代码将无用.但AFAIK空文件夹不会复制到apk,所以这种情况不太可能.