java bitmap jar 下载_Java的bitmap到C

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

方法一:

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

java部分:

1 public voidputCBitmap(Bitmap bitmap)2 {3 int width = 1024;4 int height = 600;5 int[] pixels = new int[width*height];6 bitmap.getPixels(pixels, 0, width, 0, 0, width, height); //把bitmap转换为int数组中7 nativeSetBitmapC(pixels, width, height); //该函数为native函数8 }

jni部分:

1 JNIEXPORT voidJava_android_com_Mark_nativeSetBitmapC2 (JNIEnv *env, jobject jobj, jintArray jarr, jint jwight, jint jheight) //把java的bitmap传递到底层,并进行显示

3 {4 int *arr = env->GetIntArrayElements(jarr,NULL); //获取到java传递的数组5 bitmap.setPixels((void*)arr); //将skbimap的像素设置为java传递下来的数组内容6 memcpy(vaddr, bitmap.getPixels(), bitmap.getSize());

8 env->ReleaseIntArrayElements(jarr, arr, 0);9 }

这个中方法就可以将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部分:

1 JNIEXPORT voidJNICALL Java_android_com_Mark_nativeBitmapToC2 (JNIEnv *env, jclass clazz, jobject bitmap)3 {4 AndroidBitmapInfo bmpInfo;5 void*bmpPixels;6

7 if (AndroidBitmap_getInfo(env, bitmap, &bmpInfo) < 0) {8 LOGE("AndroidBitmap_getInfo() failed !");9 return;10 }11

12 /*LOGE("AndroidBitmapInfo:width = %d",bmpInfo.width);13 LOGE("AndroidBitmapInfo:height = %d",bmpInfo.height);14 LOGE("AndroidBitmapInfo:stride = %d",bmpInfo.stride);15 LOGE("AndroidBitmapInfo:format = %d",bmpInfo.format);*/

16

17 AndroidBitmap_lockPixels(env, bitmap, &bmpPixels);18 memcpy(vaddr, bmpPixels, bmpInfo.stride*bmpInfo.height);19 AndroidBitmap_unlockPixels(env, bitmap);20 }

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

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

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

1 public staticBitmap mergeBitmap(Bitmap backBitmap, Bitmap frontBitmap)2 {3 long start =System.currentTimeMillis();4 Bitmap bitmap = backBitmap.copy(Config.ARGB_8888, true);5 Canvas canvas = newCanvas(bitmap);6 Rect baseRect = new Rect(0, 0, backBitmap.getWidth(), backBitmap.getHeight());7 Rect frontRect = new Rect(0, 0, frontBitmap.getWidth(), frontBitmap.getHeight());8 canvas.drawBitmap(frontBitmap, frontRect, baseRect, null);9 long end =System.currentTimeMillis();10 Log.e("WF->mergeBitmap = ", end - start+"ms");11 returnbitmap;12 }

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值