Создание android.graphics.Bitmap из С++
У меня есть код на С++, основанный на NDK, который должен построить объект bitmap для Android. Я уверен, что есть способ сделать это прямо из кода на С++, но это не самый простой способ сделать:)
Таким образом, метод, который я хочу вызвать,
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/С++?
Кроме того, мой последний параметр в GetStaticMethodID правильный? Я не был уверен, как указать конкретные объекты, но я думаю, что это работает. Возможно, ошибаюсь в перечислении, но!
Спасибо заранее.
Ответы
Ответ 1
У меня это в моем коде, поэтому я могу дать вам ответ, который работает.
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);
Ответ 2
Перечисления сопоставляются с классами Java при компиляции.
Этот пример может помочь вам:
http://mike-java.blogspot.com/2008/05/java-enum-in-java-native-interface-jni.html