gpt4 book ai didi

android - 什么是 JNI 图形或如何使用它?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:23:45 24 4
gpt4 key购买 nike

在 Android NDK 中有一个名为 JNI Graphics 的库。那是什么?我可以使用它通过 C/C++ 为 OpenGL ES 加载图像吗?

最佳答案

jnigraphics 库可用于从 android.bitmap.Graphics 类(当然在 Java 中)访问 C/C++ 中的位图缓冲区。

它在 NDK documentation 中被简要提及,以及 bitmap.h header docs .

它可用于加载图像,例如C/C++ 中的 OpenGL ES,但您必须做一些工作才能将 jobject 交给该库,以便它可以让您直接访问缓冲区。您可以通过 glTexImage2D() 将该缓冲区传递给 OpenGL。

首先,您需要一个 Java Bitmap 对象,您可以获取该对象并将其传递给您的 native 方法,如下所示:

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
...

BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
R.drawable.myimage, options);

MyJniMethod(bitmap); // Should be static in this example

该本地方法看起来像这样:

#include <android/bitmap.h>

void MyJniMethod(JNIEnv *env, jobject obj, jobject bitmap) {
AndroidBitmapInfo info;
uint32_t *pixels;
int ret;

AndroidBitmap_getInfo(env, bitmap, &info);

if(info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
LOGE("Bitmap format is not RGBA_8888!");
return false;
}

AndroidBitmap_lockPixels(env, bitmap, reinterpret_cast<void **>(&pixels));

// Now you can use the pixel array 'pixels', which is in RGBA format

}

请记住,当您使用完像素缓冲区后,您应该调用 AndroidBitmap_unlockPixels(),并且此示例根本不检查错误。


更新 Sid Datta 的问题:您可以通过将此添加到上面的选项来确保输出图像格式符合您的期望:

options.inPreferredConfig = Bitmap.Config.ARGB_8888;

在一种情况下,输出图像仍然在 JNI 中以未知格式结束。这似乎只发生在 GIF 上。调用 BitmapFactory.decodeResource() 后,您可以根据需要将图像转换为正确的格式:

if (bitmap.getConfig() != Bitmap.Config.ARGB_8888) {
Bitmap reformatted_bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, false);
bitmap.recycle(); /* reduce memory load in app w/o waiting for GC */
bitmap = reformatted_bitmap;
}

关于android - 什么是 JNI 图形或如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5605853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com