What is JNI Graphics and how to use it?

来源:互联网 发布:java中json数组的遍历 编辑:程序博客网 时间:2024/05/17 02:46

http://stackoverflow.com/questions/5605853/what-is-jni-graphics-or-how-to-use-it



The jnigraphics library can be used to access bitmap buffers in C/C++ from theandroid.bitmap.Graphics class (in Java, of course). It's described in more detail in the documentation that comes with the NDK under:

android-ndk-r5b/docs/STABLE-APIS.html

It can be used to load images for e.g. OpenGL ES in C/C++, but you have to do some work to hand ajobject to that library so it can give you direct access to a buffer. You can pass that buffer to OpenGL via glTexImage2D().

First, you need a Java Bitmap object, which you can acquire and pass to your native method like this:

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

That native method can look something like this:

#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}

Keep in mind you should call AndroidBitmap_unlockPixels() when you are done with the pixel buffer, and that this example doesn't check for errors at all.


原创粉丝点击