【问题标题】:How to use Asset Manager API in NDK to read raw data?如何使用 NDK 中的 Asset Manager API 读取原始数据?
【发布时间】:2018-08-25 15:23:21
【问题描述】:

我将着色器保存在资产文件夹中。 着色器的名称(文件名):“vertex.vs” 路径:资产/着色器/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 中显示)?

【问题讨论】:

  • “读取的数据在哪里?” 进入pBuffer指向的任何内存。 “如何定义 pBuffer ?” 您需要将指针传递给足够大的内存块以容纳 bytesToRead 字节数。

标签: android-ndk buffer android-assetmanager


【解决方案1】:

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

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

【讨论】:

  • @RahulNaik 听起来这对您有用,如果确实如此,请接受答案。
【解决方案2】:

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

还有there 描述此方法的算法的活动图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    相关资源
    最近更新 更多