从C++创建android.graphics.Bitmap

15

我有一些基于NDK的C++代码,需要构建一个Android位图对象。我确定有一种方法可以直接从C++代码中实现这一点,但这并不是最容易的事情;)

所以我想调用的方法是

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

如果我想从本地代码中实现这个功能,我需要按照以下步骤进行操作:

  • 查找类(android.graphics.Bitmap)。
  • 获取"createBitmap"静态方法的id。
  • 创建枚举。
  • 调用静态方法。

(最后,我需要创建一个jintArray并传递数据,但我会在之后处理它)。

不过,我对第二步和第三步非常迷茫。我的代码目前看起来像这样:

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

但是然后我就卡住了。如何从本地的C/C++代码创建枚举?

此外,我的GetStaticMethodID方法中最后一个参数是否正确?我不确定如何指定特定的对象,但我认为上面的代码是有效的。可能在枚举方面有误!

先行致谢。

2个回答

24

我在我的代码中有这段,所以我可以给你一个可用的答案。

1)获取createBitmap(int width, int height, Bitmap.Config config)静态方法的ID:

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);

啊,太棒了!在我的FindClass中使用斜杠而不是点号,这本身就是一个救命稻草!! :) - Goz
3
你的代码导致了崩溃,但是当我把配置字符串更改为这个时,它就可以工作了: jobject java_bitmap_config = env->CallStaticObjectMethod(bcfg_class, midValueOf, env->NewStringUTF("ARGB_8888")); - Oren Bengigi
由于env是一个指针,因此您还需要将“env.”更改为“env->”。 - Tertium
在该示例中,env是引用而不是指针,因此“env.”是正确的。 - Pointer Null
好的!但是我该如何返回java_bitmap呢?它是指针类型吗,例如jobject * java_bitmap作为参数传递? - volperossa

1

你能否给我一个例子? - Goz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接