Android安卓Bitmap底层JNI操作

1.添加依赖

  • 头文件: #include
  • 库依赖: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;
}

你可能感兴趣的:(Android,bitmap,android,安卓,jni)