gpt4 book ai didi

android - 仅通过 native 代码检查 apk 中是否存在目录(文件夹)

转载 作者:太空狗 更新时间:2023-10-29 16:16:19 26 4
gpt4 key购买 nike

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

android/asset_manager.h api 似乎不一致 - 它在 AAsset* AAssetManager_open(AAssetManager* mgr, const char* filename, int mode); 时返回 NULL无法打开文件,但对于目录 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;
}

但它对我来说似乎“肮脏”,而且肯定会很慢(这在我的特定代码中不是一个重要因素,但仍然 - 避免不必要的悲观情绪是很好的编码实践)。

我错过了什么吗?是否可以仅通过 native 代码检查 apk 中是否存在目录?如果不是 - 如何使用 jni 最好地做到这一点?

最佳答案

以下代码允许检查某个文件夹是否存在于 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 是否会返回非空 const char *。如果它是 NULL - 没有文件夹,否则 - 有一个。

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

关于android - 仅通过 native 代码检查 apk 中是否存在目录(文件夹),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26101371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com