如何在Android NDK中读取硬盘中的图像?

时间:2017-02-16 02:36:10

标签: c++ file-io android-ndk java-native-interface

我正在使用Android NDK制作一个简单的应用程序来绘制图像。我使用Android 6.0在我的HTC M8手机上运行应用程序。我使用stb_image库(https://github.com/nothings/stb),它使用fopen来读取图像。当我试图在我的硬盘中加载图像时(它位于“D:/Lighthouse.jpg”),我收到错误,因为它无法用fopen打开它,我确定我的图像的路径是正确的。 我的代码在Visual Studio中运行良好,但在Android 中运行良好。我做错了什么?

更新:我已经搜索过并将以下权限添加到我的AndroidManifest.xml中,但它仍然无效。

<uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="18" />

错误日志:

I/libgl2jni: Failed to load image: can't fopen
I/libgl2jni: Width =  = 1865550320
I/libgl2jni: Height =  = 1873207072
W/Adreno-ES20: <core_glTexImage2D:501>: GL_INVALID_VALUE

我的图像渲染类使用fopen调用函数加载图像:

void generateTexture()
{

    glGenTextures(1 , &mTexture);
    glBindTexture(GL_TEXTURE_2D, mTexture);// Bind our 2D texture so that following set up will be applied

    //Set texture wrapping parameter
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_MIRRORED_REPEAT);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_MIRRORED_REPEAT);

    //Set texture Filtering parameter
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

    //Load the image. This works fine in Visual Studio but not in Android Studio
    int picWidth,picHeight,n;
    unsigned char* image = stbi_load("D:/Lighthouse.jpg", &picWidth, &picHeight, &n,0);
    if (image == NULL ) {

        LOGI("Failed to load image: %s", stbi_failure_reason());

    }
    LOGI("Width =  = %d\n",
         picWidth);
    LOGI("Height =  = %d\n",
         picHeight);
    //Generate the image
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB , picWidth , picHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
    glGenerateMipmap(GL_TEXTURE_2D);

    stbi_image_free(image);// Free the reference to the image
    glBindTexture(GL_TEXTURE_2D,0); //Unbind 2D textures

}

1 个答案:

答案 0 :(得分:1)

在您的Android设备上,您只能访问手机存储空间,无法访问PC硬盘驱动器上的文件,至少不容易。将文件放在设备存储器,USB驱动器或服务器上。