1.添加依赖
- 头文件:
#include <android/bitmap.h>
- 库依赖:CMakeLists.txt里需要添加
jnigraphics
库的依赖:
target_link_libraries(${MY_LIBRARY_NAME}
jnigraphics
...
2.主要方法介绍
2.1 AndroidBitmap_getInfo
:
- 功能:获取Bitmap信息,宽、高、格式等
- 完整函数:int AndroidBitmap_getInfo(JNIEnv* env, jobject jbitmap, AndroidBitmapInfo* info);
- jobject jbitmap:java的Bitmap的底层jni对象
- AndroidBitmapInfo* info:该参数用作输出信息,返回Bitmap的信息,包含:
typedef struct {
uint32_t width;
uint32_t height;
uint32_t stride;
int32_t format;
uint32_t flags;
} AndroidBitmapInfo;
- 其中上面的格式format与Java的Bitmap格式一致,包含:
enum AndroidBitmapFormat {
ANDROID_BITMAP_FORMAT_NONE = 0,
ANDROID_BITMAP_FORMAT_RGBA_8888 = 1,
ANDROID_BITMAP_FORMAT_RGB_565 = 4,
ANDROID_BITMAP_FORMAT_RGBA_4444 = 7,
ANDROID_BITMAP_FORMAT_A_8 = 8,
};
- 返回值:0:成功 <0:失败
enum {
ANDROID_BITMAP_RESULT_SUCCESS = 0,
ANDROID_BITMAP_RESULT_BAD_PARAMETER = -1,
ANDROID_BITMAP_RESULT_JNI_EXCEPTION = -2,
ANDROID_BITMAP_RESULT_ALLOCATION_FAILED = -3,
};
2.2 AndroidBitmap_lockPixels
:
- 功能:锁定Bitmap原生像素缓存并获取Bitmap原生像素缓存地址,lock期间Bitmap原生像素缓存不会被改变
- 完整函数:int AndroidBitmap_lockPixels(JNIEnv* env, jobject jbitmap, void** addrPtr);
- jobject jbitmap:java的Bitmap的底层jni对象
- void** addrPtr:该参数用作输出信息,返回Bitmap原生像素缓存地址
- 返回值:0:成功 <0:失败,同上面一个方法
2.3 AndroidBitmap_unlockPixels
- 功能:与AndroidBitmap_lockPixels配对使用,锁定之后需要调用这个方法解除锁定
- 完整函数:int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap);
- jobject jbitmap:java的Bitmap的底层jni对象
- 返回值:0:成功 <0:失败,同上面一个方法
3.jni底层创建Bitmap对象
jobject createBitmap(JNIEnv* env, int width, int height) {
jclass bitmapConfigClass = env->FindClass("android/graphics/Bitmap$Config");
jmethodID valueOfBitmapConfigMethod = env->GetStaticMethodID(bitmapConfigClass, "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;");
jobject bitmapConfigObject = env->CallStaticObjectMethod(bitmapConfigClass, valueOfBitmapConfigMethod, bitmapConfigClass,env->NewStringUTF("ARGB_8888"));
jclass bitmapClass = env->FindClass("android/graphics/Bitmap");
jmethodID createBitmapMethod = env->GetStaticMethodID(bitmapClass, "createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;");
jobject bitmapObject = env->CallStaticObjectMethod(bitmapClass, createBitmapMethod, width, height, bitmapConfigObject);
return bitmapObject;
}