问题描述
在此代码库的PC版本中,我仅具有以下目录结构:
- myApp.exe
- resources
- - images
- - - blah0.png
- - - blah1.png
- - shaders
- - - blahA.spv
- - - blahB.spv
例如,从我的C ++代码中,我可以简单地请求fopen("resources/images/blah0.png",...)
。
对于android,它似乎是必需的
#include <android/native_activity.h>
...
AAsset* file = AAssetManager_open(aassman,"resources/images/blah0.png",AASSET_MODE_STREAMING);
size_t len = AAsset_getRemainingLength64(file);
char *buff = malloc(len);
size_t read = AAsset_read(file,buff,len);
AAsset_close(file);
不幸的是,file
即将到来nullptr
,可能是因为它找不到该资源树。
我的build.gradle脚本具有以下片段:
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
assets.srcDirs 'build/cmake/release/arm64-v8a/resources'
}
}
^指向此列表顶部概述的相同资源目录。
我该怎么做才能确保将上述资源层次结构简单地转移到我的.apk中,以便可以通过上面的AAssetManager
代码段对其进行访问?
一些其他实验:
我将assets.srcDirs
的路径更改为some/random/path/on/my/hd
,然后运行了
AAssetDir *rootAssets = AAssetManager_openDir(aassman,"");
const char *f = AAssetDir_getNextFileName(rootAssets);
while(f)
{
print(f);
f = AAssetDir_getNextFileName(rootAssets);
}
AAssetDir_close(rootAssets);
只是枚举在顶层目录中找到的文件。我注意到它枚举了some/random/path/on/my/hd
中的所有文件,但没有一个目录。 (当我将其指向我的resources
文件夹时,它不会枚举任何内容)。我不知道这是因为AAssetDir_getNextFileName
实际上只获取个文件,还是gradle的srcDirs
仅获取份文件,还是整个{{1 }}生态系统仅适用于平面目录或类似目录。
令我惊讶的是,没有清晰的文档显示“在NDK应用程序中包括资源目录”的用例,因为这似乎是一件很正常的事情。
编辑:有人要求我澄清:“如何运行cmake”。我的AAssetManager
文件包含以下代码段:
build.gradle
解决方法
好吧,我的问题是三方面的:
- gradle负责构建我的cmake项目,该项目将构建资源文件夹。因为cmake流程和资产打包之间没有明确的依赖关系,所以它似乎是在一个不可预知的时间(可能在其构造完成之前)从该文件夹中拉出的。 (如果有人知道如何指定这种依赖性,请告诉我!)
- 当我将文件夹设置为
resources
时,它不会生成root/resources/{images,shaders}
;结果为root/{images,shaders}
。 (如果有人知道如何指定代替前者,请告诉我!) -
AAssetDir_getNextFileName
不枚举文件夹。 (对此我无能为力!)
-
我建议只使用
fopen("resources/images/blah0.png","r")
而不是assets.srcDirs 'build/cmake/release/arm64-v8a
,但是如果这对您很重要,则可以设置"resources"
并排除set_variables >> create_conf_file >> check_running_job >> transform_data >> update_variables create_conf_file >> remove_conf_file check_running_stat_job >> remove_conf_file transform_openidm_data >> remove_conf_file update_orc_file_variable >> remove_conf_file
以外的所有内容