2011-10-06 24 views
12

Tengo un código C++ basado en NDK que necesita construir un objeto de mapa de bits de Android. Estoy seguro de que hay una manera de hacerlo directamente desde el código C++, pero no es el más fácil de cosas que hacer;)Creando un android.graphics.Bitmap de C++

lo tanto, el método que desea llamar está

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

Así que para hacer esto desde código nativo, necesito hacer los siguientes pasos.

  • Encuentra la clase (android.graphics.Bitmap).
  • Obtenga la id del método estático de "createBitmap".
  • Crea la enumeración.
  • Llamar al método estático.

(Eventualmente tendré que crear un jintArray y pasar los datos pero me preocuparé más tarde).

Estoy muy perdido en los pasos 2 y 3. Mi código se ve así en este momento:

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

pero entonces estoy atascado. ¿Cómo creo una enumeración del código C/C++ nativo?

Además, ¿es correcto mi último parámetro en GetStaticMethodID? No estaba seguro de cómo especificar los objetos específicos, pero creo que lo anterior funciona. Sin embargo, ¡puede estar equivocado en la enumeración!

Gracias de antemano.

Respuesta

19

tengo esto en mi código, por lo que puede dar la respuesta usted en que funciona.

1) Obtener el ID método estático de CreateBitmap (int ancho, int altura, 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;"); 

Nota firma del Bitmap.Config, tiene signo $ en ella.

2) Creación de enumeración para Bitmap.Config con valor dado:

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

Aquí creamos Bitmap.Config enumeración de valor con nombre. Otra cadena de valor posible es "RGB_565".

3) CreateBitmap Calling:

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

Ahh brillante el uso de barras en lugar de "." S en mi FindClass es un salvavidas en sí mismo !! :) – Goz

+3

Tu código causa un bloqueo, pero cuando cambié la cadena de configuración a esto, funcionó: jobject java_bitmap_config = env-> CallStaticObjectMethod (bcfg_class, midValueOf, env-> NewStringUTF ("ARGB_8888")); –

+0

como env es un puntero que también necesita para cambiar "env."a" env-> " – Tertium