在很多情况下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. Meteor.js异步全解

    翻译来源: http://phucnguyen.info/blog/everything-you-need-to-know-about-async-meteor/ posted in Web Deve ...

  2. C语言对表达式的求值顺序不是明确规定的

    讨论区看到的 WA来自那些递归下降求解的代码. 第一种情况,使用|| 和 &&: 例如s为所给串 int getval() { switch(s[c_s++]) { case 'p': ...

  3. hdu 6154 CaoHaha's staff

    CaoHaha's staff Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  4. 201621123010 《Java程序设计》第1周学习总结

    1. 本周学习总结 本周主要学习了五个知识点 Java是面向对象的语言 JDK,JRE,JVM的联系 javac及java指令 Java跨平台运行的原理 新概念:类,类是面向对象中的概念 2. 书面作 ...

  5. New Concept English Two 28 76

    $课文74  舞台之外 784. An ancient bus stopped by a dry river bed and a party of famous actors and actresse ...

  6. js中的reduce()函数

    1. 首先看下语法如下 2 . 写了个demo如下 var fa = [1,2,3,4] function red(a, b) { console.log(arguments); return a + ...

  7. 在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作

    在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作 MyEclipse6.5    ,  mysq驱动jar包为mysql-connector ...

  8. ubuntu 11.04 Gnome 恢复默认的任务栏面板

    在Ubuntu(实际是GNOME) 中,桌面上默认的任务栏菜单面板是上下两栏,上面(Panel) 是系统菜单和通知区域下面是窗口存放切换区域,那么作为ubuntu用户来说,你总会使系统用起来更顺手更美 ...

  9. Python基础知识记录

    1.去除空格 strip()  删除两边的空格.lstrip() 删除左边的空格.rstrip() 删除右边的空格 2.字符串的连接 s1='abc'  s2='cdf' s3=s1+s2    pr ...

  10. BZOJ2118: 墨墨的等式(同余类BFS)(数学转为图论题)

    2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2944  Solved: 1206[Submit][Status][Discu ...