转载请以链接形式标明出处:
本文出自:103style的博客

本文操作以 Android Studio 3.4.2 版本为例

  • NDK开发(一) :NDK入门指南
  • NDK开发(二) :JNI的数据类型
  • NDK开发(三) :JNI访问Java变量和方法
  • NDK开发(四) :JNI操作Java数组
  • NDK开发(五) :JNI实现文件加解密
  • NDK开发(六) :JNI实现文件拆分和合并
  • NDK开发(七) :JNI实现文件夹遍历
  • NDK开发(八) :JNI下Bitmap的使用

目录

  • NDK 中的 Bitmap
  • 编写测试代码
  • 实现JNI下Bitmap使用的逻辑
  • 执行测试代码

NDK 中的 Bitmap

NDK 已经为我们准备好了操作 Bitmap 的相关头文件了,它就是 <android/bitmap.h>

  • 像素格式

    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,
    };
    
  • Bitmap结构体,通过AndroidBitmap_getInfo(JNIEnv* env, jobject jbitmap, AndroidBitmapInfo* info)获取。

    typedef struct {//像素宽度uint32_t    width;//像素高度uint32_t    height;//每一行占几个字节uint32_t    stride;//像素格式int32_t     format;/** Unused. */uint32_t    flags;      // 0 for now
    } AndroidBitmapInfo;
    
  • 提供的方法

    //获取bitmap的图片信息
    int AndroidBitmap_getInfo(JNIEnv* env, jobject jbitmap,AndroidBitmapInfo* info);
    //获取像素信息
    int AndroidBitmap_lockPixels(JNIEnv* env, jobject jbitmap, void** addrPtr);
    //释放像素信息
    int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap);
    
  • 调用函数返回码

    enum {//调用成功ANDROID_BITMAP_RESULT_SUCCESS           = 0,//参数错误ANDROID_BITMAP_RESULT_BAD_PARAMETER     = -1,//出现异常ANDROID_BITMAP_RESULT_JNI_EXCEPTION     = -2,//分配失败ANDROID_BITMAP_RESULT_ALLOCATION_FAILED = -3,
    };
    

编写测试代码

  • 创建类 JniBitmapDemo,编写对应的测试代码:

    public class JniBitmapDemo {private static final String TAG = "JniBitmapDemo";static {System.loadLibrary("bitmap");}public native void passBitmap(Bitmap bitmap);public void test() {Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);bitmap.eraseColor(0xff336699); // AARRGGBBbyte[] bytes = new byte[bitmap.getWidth() * bitmap.getHeight() * 4];Buffer dst = ByteBuffer.wrap(bytes);bitmap.copyPixelsToBuffer(dst);// ARGB_8888 真实的存储顺序是 R-G-B-ALog.d(TAG, "R: " + Integer.toHexString(bytes[0] & 0xff));Log.d(TAG, "G: " + Integer.toHexString(bytes[1] & 0xff));Log.d(TAG, "B: " + Integer.toHexString(bytes[2] & 0xff));Log.d(TAG, "A: " + Integer.toHexString(bytes[3] & 0xff));passBitmap(bitmap);}
    }
    
  • 创建bitmap.cpp.
  • 添加以下代码到CMakeLists.txt
    add_library(bitmapSHAREDbitmap.cpp)
    target_link_libraries(bitmapjnigraphics${log-lib})
    

实现JNI下Bitmap使用的逻辑

#include <jni.h>
#include <android/bitmap.h>
#include <android/log.h>
#include <cstring>
#include "LogUtils.h"extern "C"
JNIEXPORT void JNICALL
Java_com_lxk_ndkdemo_JniBitmapDemo_passBitmap(JNIEnv *env, jobject instance, jobject bitmap) {if (nullptr == bitmap) {LOGE("bitmap is null");}AndroidBitmapInfo info;int result;//获取图片信息result = AndroidBitmap_getInfo(env, bitmap, &info);if (result != ANDROID_BITMAP_RESUT_SUCCESS) {LOGE("AndroidBitmap_getInfo failed, result: %d", result);return;}LOGD("bitmap width: %d, height: %d, format: %d, stride: %d", info.width, info.height,info.format, info.stride);unsigned char *addrPtr;// 获取像素信息result = AndroidBitmap_lockPixels(env, bitmap, reinterpret_cast<void **>(&addrPtr));if (result != ANDROID_BITMAP_RESULT_SUCCESS) {LOGE("AndroidBitmap_lockPixels failed, result: %d", result);return;}// 执行图片操作的逻辑int length = info.stride * info.height;for (int i = 0; i < length; ++i) {LOGD("value: %x", addrPtr[i]);}// 像素信息不再使用后需要解除锁定result = AndroidBitmap_unlockPixels(env, bitmap);if (result != ANDROID_BITMAP_RESULT_SUCCESS) {LOGE("AndroidBitmap_unlockPixels failed, result: %d", result);}}

执行测试代码

new JniBitmapDemo().test();

会在控制台打印Bitmap对应的信息。

如果出现undefined reference to AndroidBitmap_getInfo类似的报错信息。
是因为CMakeLists.txt中没有添加jnigraphics.

target_link_libraries(bitmapjnigraphics${log-lib})

Demo地址:https://github.com/103style/NDKDoc/tree/master/NDKDemo

以上

NDK开发(八) :JNI下Bitmap的使用相关推荐

  1. 【Android NDK 开发】JNI 方法解析 ( JNIEnv *env 参数 )

    文章目录 一. JNI 方法解析 二. JNIEnv *env 参数解析 三. C 语言 环境中 JNIEnv *env 参数解析 四. C ++ 环境中 JNIEnv *env 参数解析 总结 : ...

  2. 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】

    Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...

  3. 【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives )

    文章目录 I . 动态注册流程 ( 总结 ) II . JNI_OnLoad 方法 III . 被注册的本地 C/C++ 方法参数 IV . JNINativeMethod 结构体 ( 核心重点 ) ...

  4. AndroidStudio NDK开发 之 jni生成so文件

    最近在想如何将代码写到so包里,以防代码被破解~ 当然了若有人想还是有办法的,哈哈哈! 来吧! 目标:在安卓studio中生成so包: 工具:安卓studio2.0: 1.下载NDK     我下载的 ...

  5. 【Android NDK 开发】JNI 引用 ( 局部引用 | 局部引用作用域 | 局部引用产生 | 局部引用释放 | 代码示例)

    文章目录 I . JNI 引用数据类型 II . JNI 引用 与 指针 III . 局部引用 作用域 IV . 局部引用 产生 与 释放 V . 局部引用 代码示例 I . JNI 引用数据类型 1 ...

  6. 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )

    文章目录 I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI ...

  7. 【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 )

    文章目录 I . C/C++ 中的 Java 字符串数组类型 II . 获取字符串数组长度 III . 获取字符串数组元素 IV . 类型强转 ( jobject -> jstring ) V ...

  8. Android的NDK开发(3)————JNI数据类型的详解

    原文:http://blog.csdn.net/conowen/article/details/7523145 在Java中有两类数据类型:primitive types,如,int, float, ...

  9. 【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )

    文章目录 I . JNI 线程创建 II . 线程执行函数 III . 线程方法获取 Java 对象 IV . 线程方法获取 JNIEnv V . JNI 线程 完整代码示例 I . JNI 线程创建 ...

  10. 【Android NDK 开发】JNI 引用 ( 弱全局引用 | NewWeakGlobalRef | DeleteWeakGlobalRef )

    文章目录 I . 弱全局引用 II . 弱全局引用判定是否被回收 III . 弱全局引用 创建 与 删除 ( NewWeakGlobalRef | DeleteWeakGlobalRef ) IV . ...

最新文章

  1. 大数据开发实战:Hive表DDL和DML
  2. 游戏外挂设计技术探讨
  3. 相机录像出现花屏_[Unity3D]花屏问题解决
  4. 祖龙娱乐王远明:如何用UE4做出3A级材质和天气系统?
  5. c语言 sizeof_c语言详解sizeof
  6. echo “1“ > /proc/sys/net/ipv4/ip_forward(数据包转发)
  7. (转)Clang 比 GCC 编译器好在哪里?
  8. 360搜索下拉词下拉框获客方案分享
  9. 评论.gitignore?
  10. 《高效对话》— 综合素质提升书籍
  11. 智能语音转换文字——百度API
  12. 鸟哥linux私房菜pdf及配套视频分享
  13. matlab fspecial disk,Matlab fspecial 用法详述,附示例
  14. Linux中各种 command not found问题解决
  15. 国内访问英文版维基百科地址
  16. 镇魔曲网页版服务器选择,镇魔曲网页版职业选择解析 哪个职业好
  17. DOSBOX + MASM
  18. Sublime出现错误——“plugin_host has existed unexpectedly......”
  19. Unity Hair 毛发系统 初体验
  20. intellij idea 创建web 项目

热门文章

  1. Oracle 数据库实例
  2. 暗时间--BY刘未鹏
  3. 使用jemalloc优化java_C++性能优化(十) —— JeMalloc
  4. 【Vue实战】基于Vue的九宫格在线抽奖附源代码
  5. JavaScript弹窗
  6. go语言-LiteIDE 安装及使用教程
  7. android 获取手机的MAC地址
  8. 基于Vue的16个UI框架集锦
  9. 并发测试工具(ubuntu 16.04)
  10. 微信公众号开发接入_官方文档