在很多情况下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. 【hive】时间段为五分钟的统计

    问题内容 今天遇到了一个需求,需求就是时间段为5分钟的统计.有数据的时间戳.对成交单量进行统计. 想法思路 因为数据有时间戳,可以通过from_unixtime()来获取具体的时间. 有了具体的时间, ...

  2. cx_oracle 安装和配置

    前提条件: 已经成功安装python 已经成功安装oracle客户端 1.去官网上下载对应版本的cx_oracle http://cx-oracle.sourceforge.net/ 注意版本必须与p ...

  3. 使用QQ邮箱SMTP服务的javamail配置

    最近做一个小项目要用到JAVA的邮箱的发送功能.遇到一些坑这里记录分享一下:QQ群交流:697028234 1.QQ邮箱一定要设置开通SMTP/POP这项.并生成授权码. 2.用MAVEN生成一个QU ...

  4. Portability Flaw Locale Dependent Comparison

    Portability Flaw Locale Dependent Comparison [问题描述] 该问题涉及String的toUpperCase()方法.具体通过例子演示相关现象. public ...

  5. New Concept English Two 10 25

    $课文23 新居 219. I had a letter from my sister yesterday. 昨天我收到了姐姐的一封信, 220. She lives in Nigeria. 她住在尼 ...

  6. WebGL编程指南案例解析之绘制一个点

    <!DOCTYPE html> <html> <head> <title>webgl</title> <style type=&quo ...

  7. Java 异常Exception e中e的getMessage()和toString()方法的区别

    示例代码1: public class TestInfo { private static String str =null; public static void main(String[] arg ...

  8. flv格式的播放代码

    <object classid="clsid:D27CDB6E-AE6D-444553540000" class="player2" codebase=& ...

  9. java利用freemarker导出world

    一.简单导出(不含循环导出) 1.新建一个word文件.如下图: 2.使用word将文件另存为xml的格式 3.编辑xml文件内容,将'用户名'替换成-> ${username}.'简介'替换成 ...

  10. UWP 轻量级样式定义(Lightweight Styling)

    在 UWP 中,可以通过给空间直接设置属性或在 Style 中设置属性来定制空间的样式:不过这样的样式定义十分有限,比如按钮按下时的样式就没法儿设置.当然可以通过修改 Template 来设置控件的样 ...