从C++创建一个 android.graphics.Bitmap

我有一些基于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的最后一个参数是否正确?我不确定如何指定特定的对象,但我认为上述方法有效。不过,在枚举中可能是错误的!

提前致谢。


答案 1

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

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) 调用创建位图:

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

答案 2

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

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

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


推荐