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; //格式,可以看AndroidBitmapFormat uint32_t flags; //暂时没有用 } AndroidBitmapInfo;
- 其中上面的格式format与Java的Bitmap格式一致,包含:
enum AndroidBitmapFormat { ANDROID_BITMAP_FORMAT_NONE = 0, //无格式 ANDROID_BITMAP_FORMAT_RGBA_8888 = 1, //RGBA四通道,每个通道8个字节,一个像素4*8=32字节 /** Red: 5 bits, Green: 6 bits, Blue: 5 bits. **/ ANDROID_BITMAP_FORMAT_RGB_565 = 4, //RGA三通道,R:5字节 G:6字节 B:5字节,一个像素16字节 ANDROID_BITMAP_FORMAT_RGBA_4444 = 7, //RGBA四通道,每个通道4个字节,一个像素4*4=16字节 ANDROID_BITMAP_FORMAT_A_8 = 8, //Alpha单通道,8字节 };
- 返回值:0:成功 <0:失败
//返回值类型 enum { ANDROID_BITMAP_RESULT_SUCCESS = 0, //成功 ANDROID_BITMAP_RESULT_BAD_PARAMETER = -1, //参数错误 ANDROID_BITMAP_RESULT_JNI_EXCEPTION = -2, //jni异常出现 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) {
// 创建 Bitmap 的 Config 对象
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"));//这里的ARGB_8888也可以换成ALPHA_8,看需求而定
// 创建 Bitmap 对象
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;
}
版权声明:本文为q345911572原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。