2011-10-06 70 views
12

我有一些基於NDK的C++代碼需要構建一個android位圖對象。我敢肯定有一種方法可以直接從C++代碼做到這一點,但它不是最簡單的事情做;)從C++創建android.graphics.Bitmap

所以我要調用的方法是

Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

因此,要做到這一點從本機代碼我需要執行以下步驟。

  • 查找類(android.graphics.Bitmap)。
  • 獲取「createBitmap」的靜態方法ID。
  • 創建枚舉。
  • 調用靜態方法。

(最終我需要創建一個jintArray並傳入數據,但後面我會擔心)。

雖然步驟2和步驟3我很迷茫。我的代碼目前看起來像這樣:

jclass  jBitmapClass  = gpEnv->FindClass("android.graphics.Bitmap"); 
jmethodID jBitmapCreater  = gpEnv->GetStaticMethodID(jBitmapClass, "createBitmap", "(IILandroid/graphics/Bitmap/Config;)Landroid/graphics/Bitmap;"); 

但後來我卡住了。如何從本地C/C++代碼創建枚舉?

此外,我的最後一個參數GetStaticMethodID正確嗎?我不知道如何指定特定的對象,但我認爲上述工作。雖然在枚舉上可能是錯誤的!

在此先感謝。

回答

19

我有這個在我的代碼,這樣我就可以給你答案的作品。

1)獲取createBitmap的靜態方法ID(INT寬度,高度INT,Bitmap.Config配置):

jclass java_bitmap_class = (jclass)env.FindClass("android/graphics/Bitmap"); 
jmethodID mid = env.GetStaticMethodID(java_bitmap_class, "createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;"); 

注Bitmap.Config的簽名,它在它$符號。

2)Bitmap.Config與給定值創建枚舉:

const wchar_t config_name[] = L"ARGB_8888"; 
jstring j_config_name = env.NewString((const jchar*)config_name, wcslen(config_name)); 
jclass bcfg_class = env.FindClass("android/graphics/Bitmap$Config"); 
jobject java_bitmap_config = env.CallStaticObjectMethod(bcfg_class, env.GetStaticMethodID(bcfg_class, "valueOf", "(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;"), j_config_name); 

這裏我們創建名爲值Bitmap.Config枚舉。另一個可能的值字符串是「RGB_565」。

3)調用createBitmap:

java_bitmap = env.CallStaticObjectMethod(java_bitmap_class, mid, w, h, java_bitmap_config); 
+0

Ahh輝煌的使用斜線而不是「。」在我的FindClass中本身就是一個救星! :) – Goz

+3

您的代碼導致崩潰,但是當我將配置字符串更改爲此時,它工作: jobject java_bitmap_config = env-> CallStaticObjectMethod(bcfg_class,midValueOf,env-> NewStringUTF(「ARGB_8888」));作爲env的 –

+0

是一個指針,你也需要改變「env。「env->」 – Tertium