Создание android.graphics.Bitmap из C ++ - PullRequest
       31

Создание android.graphics.Bitmap из C ++

13 голосов
/ 06 октября 2011

У меня есть некоторый код C ++ на основе NDK, который необходим для создания растрового объекта Android. Я уверен, что есть способ сделать это напрямую из кода C ++, но это не самый простой способ;)

Итак, метод, который я хочу вызвать, это

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

Итак, чтобы сделать это из нативного кода, мне нужно выполнить следующие шаги.

  • Найдите класс (android.graphics.Bitmap).
  • Получить статический идентификатор метода «createBitmap».
  • Создать перечисление.
  • Вызвать статический метод.

(В конце концов мне нужно будет создать 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 ]

21 голосов
/ 12 октября 2011

У меня есть это в моем коде, поэтому я могу дать вам ответ, который работает.

1) Получить статический идентификатор метода createBitmap (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 голос
/ 09 октября 2011

При компиляции перечисления сопоставляются с классами Java.

Этот пример может вам помочь:

http://mike -java.blogspot.com / 2008/05 / Java-перечислимый-в-Java-нативный интерфейс-jni.html

...