如何通过Gradle向NDK项目添加资源图像,声音文件,着色器等?

问题描述

在此代码库的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

解决方法

好吧,我的问题是三方面的:

  1. gradle负责构建我的cmake项目,该项目将构建资源文件夹。因为cmake流程和资产打包之间没有明确的依赖关系,所以它似乎是在一个不可预知的时间(可能在其构造完成之前)从该文件夹中拉出的。 (如果有人知道如何指定这种依赖性,请告诉我!)
  2. 当我将文件夹设置为resources时,它不会生成root/resources/{images,shaders};结果为root/{images,shaders}。 (如果有人知道如何指定代替前者,请告诉我!)
  3. AAssetDir_getNextFileName 枚举文件夹。 (对此我无能为力!)
,
  1. 我建议只使用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 以外的所有内容

  2. Here是纯C ++解决方案的概述。另外,您也可以通过JNI调用Java API(为here)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...