我正在使用OpenGL ES 3.0,并使用Eclipse NDK通过Google Nexus渲染体积数据。
我正在使用AssetManager将实际为16 MB的原始文件的卷数据加载到实际设备中,但无法正常工作。我也将资源存储在包含标题的Asset文件夹中,但是仍然在logcat __load_uniform_float:802>:GL_INVALID_OPERATION中收到相同的错误
我尝试向Google搜索一些相关示例,但找不到任何示例。

这是我的代码:

int LoadVolume()
{
    GLubyte *pdata;
    const unsigned int BUFFER_SIZE = XDIM*YDIM*ZDIM;
    GLubyte buffer[BUFFER_SIZE];
    AAssetManager*mgr;
    AAsset* asset=AAssetManager_open(mgr,"Engine256.raw",AASSET_MODE_BUFFER);
    if(!asset)
    {
    __android_log_print(ANDROID_LOG_ERROR, "TAG", "_ASSET_NOT_FOUND_");
     return 0;
    }
    pdata=(GLubyte*)AAsset_read(asset,buffer,BUFFER_SIZE);

    AAsset_close(asset);

   glGenTextures ( 1,&textureId );
   glBindTexture ( GL_TEXTURE_3D,textureId );
   glTexImage3D ( GL_TEXTURE_3D, 0, GL_RED,XDIM, YDIM, ZDIM, 0,
                  GL_RED, GL_UNSIGNED_BYTE,pdata);

   glTexParameteri ( GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
   glTexParameteri ( GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
   glTexParameteri ( GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
   glTexParameteri ( GL_TEXTURE_3D, GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE );
   glTexParameteri ( GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

   glBindTexture ( GL_TEXTURE_3D, 0 );
   return 1;
}

最佳答案

如果看这两行:

AAssetManager*mgr;
AAsset* asset=AAssetManager_open(mgr,"Engine256.raw",AASSET_MODE_BUFFER);


您将mgr声明为指针变量,但没有为其分配值。然后,在未初始化的情况下,在下一行使用它。

您需要通过JNI接口将Java对象中的AssetManager对象传递到本机代码中,然后使用此调用获得AAssetManager,其中assetManager是传入的Java对象,它是本机中的代码作为jobject类型参数。

AAssetManager *mgr = AAssetManager_fromJava(env, assetManager);


这个问题/答案更详细地显示了如何将Java对象传递给本机代码:
Can't access AAssetManager in native code passed from Java in WallpaperService

关于android - 从NDK无法使用AssetManager,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24604656/

10-11 22:42
查看更多