在很多情况下android程序员需用到c,bimap这个是一个java中的类,android底层有一个skbitmap类和其对应。先在我遇到了需要把java的bitmap传递到底层中进行一些操作。现在我有两种方法:

方法一:

  就是通过java把bitmap直接转换为数组,在通过jni数组的方式传递到底层中。

  java部分:

 public void putCBitmap(Bitmap bitmap)
{
int width = 1024;
int height = 600;
int[] pixels = new int[width*height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height); //把bitmap转换为int数组中
nativeSetBitmapC(pixels, width, height); //该函数为native函数
}

  jni部分:

 JNIEXPORT void Java_android_com_Mark_nativeSetBitmapC
(JNIEnv *env, jobject jobj, jintArray jarr, jint jwight, jint jheight) //把java的bitmap传递到底层,并进行显示
{
int *arr = env->GetIntArrayElements(jarr,NULL); //获取到java传递的数组
bitmap.setPixels((void*)arr); //将skbimap的像素设置为java传递下来的数组内容
memcpy(vaddr, bitmap.getPixels(), bitmap.getSize());
env->ReleaseIntArrayElements(jarr, arr, );
}

  这个中方法就可以将java的bitma传递到底层的skbitmap中,但是如果频繁如此操作就会降低效率。

方法二:

  使用android中自带的bitmap.h来完成速度会快很多。android\development\ndk\platforms\android-8\include\android\bitmap.h

  java代码:

public static native void nativeBitmapToC(Bitmap bitmap);

  jni部分:

 

 JNIEXPORT void JNICALL Java_android_com_Mark_nativeBitmapToC
(JNIEnv *env, jclass clazz, jobject bitmap)
{
AndroidBitmapInfo bmpInfo;
void* bmpPixels; if (AndroidBitmap_getInfo(env, bitmap, &bmpInfo) < ) {
LOGE("AndroidBitmap_getInfo() failed ! ");
return;
} /* LOGE("AndroidBitmapInfo:width = %d",bmpInfo.width);
LOGE("AndroidBitmapInfo:height = %d",bmpInfo.height);
LOGE("AndroidBitmapInfo:stride = %d",bmpInfo.stride);
LOGE("AndroidBitmapInfo:format = %d",bmpInfo.format); */ AndroidBitmap_lockPixels(env, bitmap, &bmpPixels);
memcpy(vaddr, bmpPixels, bmpInfo.stride*bmpInfo.height);
AndroidBitmap_unlockPixels(env, bitmap);
}

  这样一样可以实现将java的bitmap直接传递到底层,这样速度很快。但是需要注意的是要在jni里面加入 #include <android/bitmap.h> 头文件。

  还有就是Android.mk文件中记得加入LOCAL_LDFLAGS += -ljnigraphics 否则编译不过。

  java如何把两个bitmap组合成一个bitmap。

 public static Bitmap mergeBitmap(Bitmap backBitmap, Bitmap frontBitmap)
{
long start = System.currentTimeMillis();
Bitmap bitmap = backBitmap.copy(Config.ARGB_8888, true);
Canvas canvas = new Canvas(bitmap);
Rect baseRect = new Rect(0, 0, backBitmap.getWidth(), backBitmap.getHeight());
Rect frontRect = new Rect(0, 0, frontBitmap.getWidth(), frontBitmap.getHeight());
canvas.drawBitmap(frontBitmap, frontRect, baseRect, null);
long end = System.currentTimeMillis();
Log.e("WF->mergeBitmap = ", end - start+"ms");
return bitmap;
}

  写博客是怕自己忘记,也希望能给后来的人一些帮助。有不对的地方欢迎指出。

  

Java的bitmap到C的更多相关文章

  1. java实现BitMap

    package bitmap; public class BitMap { private byte[] bytes; public BitMap(byte[] bytes) { super(); t ...

  2. java使用bitmap求两个数组的交集

    一般来说int代表一个数字,但是如果利用每一个位 ,则可以表示32个数字 ,在数据量极大的情况下可以显著的减轻内存的负担.我们就以int为例构造一个bitmap,并使用其来解决一个简单的问题:求两个数 ...

  3. 【算法与数据结构专场】BitMap算法基本操作代码实现

    上篇我们讲了BitMap是如何对数据进行存储的,没看过的可以看一下[算法与数据结构专场]BitMap算法介绍 这篇我们来讲一下BitMap这个数据结构的代码实现. 回顾下数据的存储原理 一个二进制位对 ...

  4. Android笔记--Bitmap

    Android | Bitmap解析 Android中Bitmap是对图像的一种抽象.通过他可以对相应的图像进行剪裁,旋转,压缩,缩放等操作.这里循序渐进的一步步了解Bitmap的相关内容. 先了解B ...

  5. Android图像处理之BitMap(2)

    Bitmap 相关 1. Bitmap比较特别 因为其不可创建 而只能借助于BitmapFactory 而根据图像来源又可分以下几种情况: * png图片 如:R.drawable.tianjin J ...

  6. Android Bitmap变迁与原理解析(4.x-8.x)

    App开发不可避免的要和图片打交道,由于其占用内存非常大,管理不当很容易导致内存不足,最后OOM,图片的背后其实是Bitmap,它是Android中最能吃内存的对象之一,也是很多OOM的元凶,不过,在 ...

  7. 图片系列(6)不同版本上 Bitmap 内存分配与回收原理对比

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...

  8. Android之三种网络请求解析数据(最佳案例)

    AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...

  9. Android 保存图片到SQLite

    [转:原文] Resources res = getResources(); Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.ico ...

随机推荐

  1. python学习笔记(六)---sublime text3 创建python项目

    1.创建项目 依次鼠标左键点击Project>Add Folder to Project...,选择test文件夹: 2.保存项目 依次鼠标左键点击Project>Save Project ...

  2. Java虚拟机体系结构分析

    下图是JAVA虚拟机的结构图: 每个Java虚拟机都有一个类装载子系统,它根据给定的全限定名来装入类型(类或接口).同样,每个Java虚拟机都有一个执行引擎,它负责执行那些包含在被装载类的方法中的指令 ...

  3. Vue.js组件设计原则

    页面上把每个独立可以交互的区域视为一个组件 每个组件对应一个工程目录,组件所需要的各种资源在这个目录下就近维护 页面不过是组件的容器,组件可以嵌套自由组合形成完整的页面

  4. Linux安装MySQL遇到的问题

    安装: https://www.cnblogs.com/fnlingnzb-learner/p/5830622.html https://www.cnblogs.com/xinjing-jingxin ...

  5. 在JavaScript中进行文件处理,第二部分:文件读取

    译注:原文是<JavaScript高级程序设计>的作者Nicholas Zakas写的,本翻译纯属为自己学习而做,仅供参考.原文链接:这里 在我的前一篇blog中,我介绍了在JavaScr ...

  6. Unix网络编程第三版源码编译

    配置: $ cd Unix-Network-Programming/ $ chmod 755 configure $ ./configure 主要的工作是检查系统是否有源码编译所依赖的各种资源(系统版 ...

  7. 判断设备(PC,安Android,iOS)

    //判断是不是PC function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = new Array("An ...

  8. BZOJ2124: 等差子序列(树状数组&hash -> bitset 求是否存在长度为3的等差数列)

    2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 2354  Solved: 826[Submit][Status][Discuss ...

  9. Log4j(一):Log4j将日志信息写入数据库

    前言 为了监听一些数据的采集等功能,需要随时监听设备的状态,所以需要运行的时候将日志打入到数据库中. 正文 第一步: 首先是jar包,由于我使用的是springboot,所以,在springboot- ...

  10. 使用xUnit为.net core程序进行单元测试(2)

    第一部分: http://www.cnblogs.com/cgzl/p/8283610.html 下面有一点点内容是重叠的.... String Assert 测试string是否相等: [Fact] ...