2017-02-16 46 views
0

我正在使用Android NDK製作繪製圖像的簡單應用程序。我使用Android 6.0在我的HTC M8手機上運行應用程序。我使用stb_image庫(https://github.com/nothings/stb),它使用fopen來讀取圖像。當我試圖在我的硬盤驅動器(它位於「D:/Lighthouse.jpg」)中加載圖像時,我得到了錯誤,因爲它無法用fopen打開它,我確信我的圖像的路徑是正確的。 我的代碼在Visual Studio中正常工作,但不在Android中。我究竟做錯了什麼?如何在Android NDK的硬盤中讀取圖像?

更新:我搜索了四周,並將以下權限添加到我的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 

} 
+0

你在模擬器中試試嗎? – yakobom

+0

抱歉,忘記提供這些信息。我在HTC M8手機上運行它。 –

+0

所以我不明白 - 你怎麼能訪問「D:/Lighthouse.jpg」?驅動器連接時,設備上是否存在此路徑? – yakobom

回答

1

從你的Android設備,你只能訪問手機的存儲,你無法訪問PC硬盤上的文件,至少不容易。將文件放在設備存儲器或USB驅動器上或服務器上。

+0

感謝您的解決方案。我現在明白了。順便說一句,把它放進我的SD卡可以嗎?如果是的話,我應該如何解決它的stbi_load功能? stbi_load(「/ sdcard/Lighthouse.jpg」,....)是否正確?我的SD卡的完整路徑是:電腦\ HTC One_M8 \ SD卡。 –

+1

您可以從存儲,內部或外部訪問文件,沒有問題。我認爲最簡單的方法是調用Java方法,它使用Environment.getExternalStorageDirectory – yakobom

+0

我使用Environment.getExternalStorageDirectory.getAbsolutePath()來獲取路徑。它返回:「/ storage/emulated/0」。所以我改變stbi_load的輸入(「/ storage/emulated/0/Lighthouse.jpg」,....)。但是,它仍然無法打開圖像,我很確定圖像確實存在。 –