我需要检查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);
,实现总是返回{{1即使在内部它无法打开/找到apk中的目录。
new AAssetDir(...)
是前向声明并且它的实现被隐藏在.cpp文件中是非常恼人的,否则它可能(可能?)可以检查内部AAssetDir
有效的对象。
我现在正在探索另一个选项 - 调用java并执行以下操作:
AssetDir
但似乎"脏"对我来说,它肯定会很慢(这不是我特定代码中的一个重要因素,但仍然 - 避免不必要的悲观化是良好的编码实践)。
我错过了什么吗?是否可以通过本机代码检查apk中是否存在目录?如果不是 - 如何最好地使用jni?
答案 0 :(得分:6)
以下代码允许检查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,所以这种情况不太可能。