NDK开发(八) :JNI下Bitmap的使用
转载请以链接形式标明出处:
本文出自: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的使用相关推荐
- 【Android NDK 开发】JNI 方法解析 ( JNIEnv *env 参数 )
文章目录 一. JNI 方法解析 二. JNIEnv *env 参数解析 三. C 语言 环境中 JNIEnv *env 参数解析 四. C ++ 环境中 JNIEnv *env 参数解析 总结 : ...
- 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】
Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...
- 【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives )
文章目录 I . 动态注册流程 ( 总结 ) II . JNI_OnLoad 方法 III . 被注册的本地 C/C++ 方法参数 IV . JNINativeMethod 结构体 ( 核心重点 ) ...
- AndroidStudio NDK开发 之 jni生成so文件
最近在想如何将代码写到so包里,以防代码被破解~ 当然了若有人想还是有办法的,哈哈哈! 来吧! 目标:在安卓studio中生成so包: 工具:安卓studio2.0: 1.下载NDK 我下载的 ...
- 【Android NDK 开发】JNI 引用 ( 局部引用 | 局部引用作用域 | 局部引用产生 | 局部引用释放 | 代码示例)
文章目录 I . JNI 引用数据类型 II . JNI 引用 与 指针 III . 局部引用 作用域 IV . 局部引用 产生 与 释放 V . 局部引用 代码示例 I . JNI 引用数据类型 1 ...
- 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
文章目录 I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI ...
- 【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 )
文章目录 I . C/C++ 中的 Java 字符串数组类型 II . 获取字符串数组长度 III . 获取字符串数组元素 IV . 类型强转 ( jobject -> jstring ) V ...
- Android的NDK开发(3)————JNI数据类型的详解
原文:http://blog.csdn.net/conowen/article/details/7523145 在Java中有两类数据类型:primitive types,如,int, float, ...
- 【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )
文章目录 I . JNI 线程创建 II . 线程执行函数 III . 线程方法获取 Java 对象 IV . 线程方法获取 JNIEnv V . JNI 线程 完整代码示例 I . JNI 线程创建 ...
- 【Android NDK 开发】JNI 引用 ( 弱全局引用 | NewWeakGlobalRef | DeleteWeakGlobalRef )
文章目录 I . 弱全局引用 II . 弱全局引用判定是否被回收 III . 弱全局引用 创建 与 删除 ( NewWeakGlobalRef | DeleteWeakGlobalRef ) IV . ...
最新文章
- 大数据开发实战:Hive表DDL和DML
- 游戏外挂设计技术探讨
- 相机录像出现花屏_[Unity3D]花屏问题解决
- 祖龙娱乐王远明:如何用UE4做出3A级材质和天气系统?
- c语言 sizeof_c语言详解sizeof
- echo “1“ > /proc/sys/net/ipv4/ip_forward(数据包转发)
- (转)Clang 比 GCC 编译器好在哪里?
- 360搜索下拉词下拉框获客方案分享
- 评论.gitignore?
- 《高效对话》— 综合素质提升书籍
- 智能语音转换文字——百度API
- 鸟哥linux私房菜pdf及配套视频分享
- matlab fspecial disk,Matlab fspecial 用法详述,附示例
- Linux中各种 command not found问题解决
- 国内访问英文版维基百科地址
- 镇魔曲网页版服务器选择,镇魔曲网页版职业选择解析 哪个职业好
- DOSBOX + MASM
- Sublime出现错误——“plugin_host has existed unexpectedly......”
- Unity Hair 毛发系统 初体验
- intellij idea 创建web 项目