如何使用NDK中的Asset Manager API读取原始数据?

Rah*_*aik 6 buffer android-ndk android-assetmanager

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

我想从 NDK 的 C++ 文件访问此文件,而不调用 Java 或 JNI,无论它是什么。通过阅读各种资源,我设法理解我必须使用标题

#include <android/asset_manager.h>
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

但它没有任何作用。这个读取功能是怎么回事。

AAsset_read(mAsset,pBuffer,bytesToRead);
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ohn 9

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

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