2012-07-19 39 views
8

該程序應該從SD卡中獲取圖像並調整其亮度。圖像通過NDK C代碼從SD卡中獲取。需要注意的是,描述圖像路徑的字符串通過JNI傳遞給NDK。將字符串傳遞給Android NDK中的C代碼

Java代碼:

private void adjustBrightness() { 
    imagePath  = (Environment.getExternalStorageDirectory().getPath()+"earthglobe.jpeg").toCharArray(); 
    brightness(imagePath, brightness); 
} 

public native void brightness(char[] imagePath, float brightness); 

NDK代碼:

JNIEXPORT void JNICALL Java_com_example_ImageActivity_brightness(JNIEnv * env,char[] bitmappath, jfloat brightnessValue) 
{ 
    string bmpath = bitmappath+'\0'; 
    jobject obj = fopen(bitmappath , "rb"); 
} 
+0

這是可笑的:''jobject OBJ = FOPEN(bitmappath, 「RB」);'' – 2012-07-19 10:43:20

回答

19

你不可錯過的char []這種方式。

在Java中使用:

public static native void brightness(String imagePath, float brightness); 

在本地使用:

std::string ConvertJString(JNIEnv* env, jstring str) 
{ 
    if (!str) LString(); 

    const jsize len = env->GetStringUTFLength(str); 
    const char* strChars = env->GetStringUTFChars(str, (jboolean *)0); 

    std::string Result(strChars, len); 

    env->ReleaseStringUTFChars(str, strChars); 

    return Result; 
} 

JNIEXPORT void JNICALL Java_com_example_ImageActivity_brightness(JNIEnv * env, jobject obj, jstring bitmappath, jfloat brightnessValue) 
{ 
    std::string bmpath = ConvertJString(env, bitmappath); 
    FILE* f = fopen(bmpath.c_str(), "rb"); 

    // do something useful here 

    fclose(f); 
} 
+0

謝謝,我想該位圖作爲一個Jobject而不是一個文件,因爲已經有一個函數可以從Jobject中檢索像素...有沒有什麼辦法可以做到這一點? – 2012-07-19 11:18:02

+0

使用java.nio.ByteBuffer傳遞像素。 – 2012-07-19 11:20:52

+0

我想你讓我錯了....要麼我想檢索BMP作爲JObject(在NDK),或者我需要一種方法來獲取來自NDK文件中的像素。 – 2012-07-19 11:23:32