Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用Gradle向NDK项目添加资源(图像、声音文件、着色器等)?_Android_C++_Gradle_Android Ndk - Fatal编程技术网

Android 如何使用Gradle向NDK项目添加资源(图像、声音文件、着色器等)?

Android 如何使用Gradle向NDK项目添加资源(图像、声音文件、着色器等)?,android,c++,gradle,android-ndk,Android,C++,Gradle,Android Ndk,在这个代码库的PC版本中,我只是有以下目录结构: - myApp.exe - resources - - images - - - blah0.png - - - blah1.png - - shaders - - - blahA.spv - - - blahB.spv < >从我的C++代码中,我可以简单地请求 fOnt(“资源/图像/BLAH0.PNG”,…)< /COD>,例如: 在安卓系统中,它似乎被要求 #include <android/native_acti

在这个代码库的PC版本中,我只是有以下目录结构:

 - myApp.exe
 - resources
 - - images
 - - - blah0.png
 - - - blah1.png
 - - shaders
 - - - blahA.spv
 - - - blahB.spv
< >从我的C++代码中,我可以简单地请求<代码> fOnt(“资源/图像/BLAH0.PNG”,…)< /COD>,例如:

在安卓系统中,它似乎被要求

#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);
^指向此列表顶部列出的相同资源目录


我需要做些什么来确保上述资源层次结构被简单地传输到我的.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\u getNextFileName
实际上只获取文件,还是gradle的
srcDirs
只复制文件,或者整个
AAssetManager
生态系统只在平面目录上工作,或者是什么

我感到惊讶的是,没有清晰的文档显示“在NDK应用程序中包含资源目录”的用例,因为这似乎是一件非常正常的事情


编辑:我被要求澄清“cmake是如何运行的”。作为我的
build.gradle
文件的一部分,我有以下代码片段:

  sourceSets {
    main {
      manifest.srcFile 'AndroidManifest.xml'
      assets.srcDirs 'build/cmake/release/arm64-v8a/resources'
    }
  }
  externalNativeBuild {
    cmake {
      version "3.18.1"
      path "../CMakeLists.txt"
      buildStagingDirectory buildDir
    }
  }

我的问题有三个方面:

  • gradle负责构建我的cmake项目,该项目构建资源文件夹。因为cmake流程和资产打包之间没有明确的依赖关系,所以它似乎是在一个不可预测的时间(可能是在构建完成之前)从该文件夹中提取的。(如果有人知道如何指定这种依赖关系,请告诉我!)
  • 当我将文件夹设置为
    resources
    时,它不会产生
    root/resources/{images,shaders}
    ;它产生
    root/{images,shaders}
    。(如果有人知道如何指定执行前者,请让我知道!)
  • AAssetDir\u getNextFileName
    不枚举文件夹。(对此我无能为力!)
  • 我建议简单地使用
    AAssetManager_open(aassman,/images/blah0.png)
    而不是
    fopen(“resources/images/blah0.png”,“r”)
    ,但是如果这对您非常重要,您可以设置
    assets.srcDirs'build/cmake/release/arm64-v8a
    ,并排除
    之外的所有资源

  • 是纯C++解决方案的概要。或者,您也可以通过JNI调用JavaAPI(as)


  • 不清楚如何运行构建资源文件夹的cmake项目。@AlexCohn请参阅编辑附加原始问题。我目前已经通过指向gradle指导的cmake构建之外的一个预构建资源目录“解决”了我的问题,尽管这需要我手动并有意识地确保文件夹是最新的并且在适当的位置(与拥有构建系统的要点相反)。因此,如果有人能让我知道如何将cmake重新整合到gradle中,同时确保gradle等待cmake构建连接到资源目录,我将不胜感激!如果你能把这个非答案移到问题部分,那就太好了。