Android 如何使用Gradle向NDK项目添加资源(图像、声音文件、着色器等)?
在这个代码库的PC版本中,我只是有以下目录结构: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
- 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
}
}
我的问题有三个方面:
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
,并排除之外的所有资源
不清楚如何运行构建资源文件夹的cmake项目。@AlexCohn请参阅编辑附加原始问题。我目前已经通过指向gradle指导的cmake构建之外的一个预构建资源目录“解决”了我的问题,尽管这需要我手动并有意识地确保文件夹是最新的并且在适当的位置(与拥有构建系统的要点相反)。因此,如果有人能让我知道如何将cmake重新整合到gradle中,同时确保gradle等待cmake构建连接到资源目录,我将不胜感激!如果你能把这个非答案移到问题部分,那就太好了。