Подскажите, как передать изображение из библиотеки на 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
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);
}
Надеюсь, идея вам понятна. Если вопрос производительности для вас критичен, почитайте это
Комментариев нет:
Отправить комментарий