在很多情況下android程序員需用到c,bimap這個是一個java中的類,android底層有一個skbitmap類和其對應。先在我遇到了需要把java的bitmap傳遞到底層中進行一些操作。現在我有兩種方法:
方法一:
就是通過java把bitmap直接轉換為數組,在通過jni數組的方式傳遞到底層中。
java部分:
1 public void putCBitmap(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 void Java_android_com_Mark_nativeSetBitmapC 2 (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 void JNICALL Java_android_com_Mark_nativeBitmapToC 2 (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/bitmap.h> 頭文件。
還有就是Android.mk文件中記得加入LOCAL_LDFLAGS += -ljnigraphics 否則編譯不過。
java如何把兩個bitmap組合成一個bitmap。
1 public static Bitmap mergeBitmap(Bitmap backBitmap, Bitmap frontBitmap) 2 { 3 long start = System.currentTimeMillis(); 4 Bitmap bitmap = backBitmap.copy(Config.ARGB_8888, true); 5 Canvas canvas = new Canvas(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 return bitmap; 12 }
寫博客是怕自己忘記,也希望能給后來的人一些幫助。有不對的地方歡迎指出。