Страницы

Поиск по вопросам

среда, 21 ноября 2018 г.

Передача изображения из нативной библиотеки в Android

Подскажите, как передать изображение из библиотеки на C++ в приложение под андроидом.
Пишу простой html рендер: https://www.livecoding.tv/video/simple-html-render-c/ . Во второй части хочу запустить его под андроидом.
Самый простой вариант передачи изображения:
String img = Render("index.html"); Bitmap bitmap = getBitmap(img);
Через файл. Но это костыль и так делать не надо.
Как реализовать передачу изображения?
На мой взгляд самым простым способом будет возвращать само изображение, а не ссылку на него. Как его загрузить в Bitmap?
Не самым простым способом будет формирование изображение из C++. Есть пример вызова Bitmap.createBitmap() - https://stackoverflow.com/questions/7677092/creating-an-android-graphics-bitmap-from-c , но это недостаточно для решения.


Ответ

Верните из JNI массив байтов, а потом грузите на стороне Java картинку из этого массива, как хотите.
JNIEXPORT jbyteArray JNICALL get_bitmap(JNIEnv *env, jobject obj, jstring str) { const char *nativeString = env->GetStringUTFChars(str, 0); // "index.html" char* data = ;//указатель на данные, берите их откуда хотите size_t size = ; // размер данных
jbyteArray result = env->NewByteArray(size);
if (result == NULL) { return NULL; // out of memory error thrown }
env->SetByteArrayRegion(result, 0, size, data); return result; }
// Регистрация нативных методов в JVM static JNINativeMethod methods[] = { {"getBitmap", "(Ljava/lang/String;)[B", (void *)get_bitmap}, };
jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { JNIEnv *env; if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_4) != JNI_OK) return JNI_FALSE;
jclass clazz = env->FindClass("com/example/MyCoolClass"); if (clazz ) { if (env->RegisterNatives(clazz, methods, sizeof(methods)/sizeof(methods[0])) < 0) return JNI_FALSE; }
return JNI_VERSION_1_4; }
На стороне Java:
package com.example;
class MyCoolClass { public static void main(String[] args) { String img = Render("index.html"); byte[] bytes = getBitmap(img); Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); } private static native byte[] getBitmap(String arg); }
Надеюсь, идея вам понятна. Если вопрос производительности для вас критичен, почитайте это

Комментариев нет:

Отправить комментарий