2011-10-06 66 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