2

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 でディレクトリを開く/見つけることができなかったとしても、常に a を返します。

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;
}

しかし、それは私には「汚い」ように見え、間違いなくかなり遅くなります (これは私の特定のコードでは大きな要因ではありませんが、それでも - 不必要な悲観化を避けることは良いコーディング方法です)。

私は何かを逃しましたか?ディレクトリがapkに存在するかどうかをネイティブコードのみで確認することはできますか? そうでない場合-jniでそれを行うにはどうすればよいですか?

4

1 に答える 1

9

次のコードでは、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;
}

AAsetManager_openDir指定されたディレクトリが存在しない場合でも、常に初期化されたオブジェクトへのポインターを返します。つまり、かどうかを確認することassetDir==NULLは無意味です。トリックはAAssetDir_getNextFileName、非 null を返すかどうかを確認することconst char *です。そうであればNULL、フォルダはありません。それ以外の場合は、フォルダがあります。

重要なお知らせ: フォルダーが空であるが、何らかの理由でそれが apk に存在するかどうかを知る必要がある場合、そのコードはフォルダーの存在をチェックする方法が原因で役に立たなくなります。しかし、AFAIK の空のフォルダーは apk にコピーされないため、そのような状況はありそうにありません。

于 2014-09-30T15:04:15.517 に答える