从C ++创建android.graphics.Bitmap

时间:2011-10-06 15:59:24

标签: java android c++ java-native-interface android-ndk

我有一些基于NDK的C ++代码需要构建一个android位图对象。我确信有一种方法可以直接从C ++代码执行此操作,但这不是最简单的事情;)

所以我想调用的方法是

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中的最后一个参数是否正确?我不知道如何指定具体的对象,但我认为上述工作。但是,枚举可能是错误的!

提前致谢。

2 个答案:

答案 0 :(得分:20)

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

1)获取createBitmap的静态方法id(int width,int height,Bitmap.Config 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);

答案 1 :(得分:1)

枚举在编译时映射到Java类。

此示例可能对您有所帮助:

http://mike-java.blogspot.com/2008/05/java-enum-in-java-native-interface-jni.html