http://stackoverflow.com/questions/5605853/what-is-jni-graphics-or-how-to-use-it
Thejnigraphics
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 viaglTexImage2D()
.
First, you need a JavaBitmap
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 callAndroidBitmap_unlockPixels()
when you are done with the pixel buffer, and that this example doesn't check for errors at all.