5

我将着色器保存在资产文件夹中。着色器名称(文件名):“vertex.vs”路径:assets/shaders/vertex.vs

我想从 NDK 的 C++ 文件访问这个文件,而不用调用 Java 或 JNI。通过阅读各种资源,我设法了解我必须使用标题

#include <android/asset_manager.h>

之后我创建指针并打开它。

const char* mPath = "shaders/vertex.vs";
AAssetManager* mAssetManager;
AAsset* mAsset;
mAsset = AAssetManager_open(mAssetManager, mPath,AASSET_MODE_UNKNOWN);
int foo = AAsset_getLength(mAsset);
LOGD( "This is a number: %d", foo );
AAsset_close(mAsset);

但它什么也没做。这个读取功能有什么用。

AAsset_read(mAsset,pBuffer,bytesToRead);

数据在哪里读取?如何定义 pBuffer ?有人可以分享一个简单的例子,说明如何从原始文件中读取数据以及如何访问它(比如在 logcat 中显示它)?

4

2 回答 2

5

您必须首先初始化mAssetManager,我们通常通过 JNI 调用从 Java 中获取它,参见例如这个答案。您可以像这样在 C++ 代码中获取此 Java 对象,但这仍然需要JNIEnv

如果你真的想在没有 JNI 交互的情况下从 APK 中提取资产,那并非不可能。诀窍是找到您的 APK 文件并相信它是一个 ZIP 文件。

于 2018-03-16T16:08:17.887 回答
1

有人可以分享一个简单的例子,说明如何从原始文件中读取数据以及如何访问它(比如在 logcat 中显示它)?

这里的示例项目从 res/raw 解压资源文件并将其放入可从本机代码访问的 FilesDir 位置(例如 /data/user/0/com.example.myapp/files)。

还有一个描述这种方法的算法的活动图

于 2020-09-01T11:08:44.013 回答