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

问题描述 投票:0回答:3

我将着色器保存在资产文件夹中。 着色器的名称(文件名):“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 中显示它)吗?

android-ndk buffer android-assetmanager
3个回答
9
投票

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

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


1
投票

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

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

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


0
投票

我用它来加载资源中的着色器文件

std::string readShaderAsset(AAssetManager *assetManager, std::string& name)
{
    std::string out;

    auto asset = AAssetManager_open(assetManager, name.c_str(), AASSET_MODE_BUFFER);
    auto len = AAsset_getLength(asset);      
    auto buffer = (const char*) AAsset_getBuffer(asset);
    for (auto i = 0; i < len; ++i) {
        out += buffer[i];
    }
    AAsset_close(asset);
    return out;
}
© www.soinside.com 2019 - 2024. All rights reserved.