直接在Android位图中传递来自JNI的字节数组

时间:2013-01-11 10:56:31

标签: android bitmap java-native-interface

我在JNI中将灰度图像作为字节数组,我需要将其传递给Android才能在屏幕上显示。目前我的代码如下:我将字节数组复制到JNI中的int数组,然后用该数组设置Bitmap的像素:

JNI方面:

jintArray frame = g_env->NewIntArray(frameSize);
int tempFrame[frameSize];
for(int pix = 0; pix < frameSize; pix++){
    //convert every byte to int
    jint greyValue = 0xff000000 | (( byteArray[pix] << 16) & 0xffff0000) | ((byteArray[pix] << 8) & 0xff00ff00) | (byteArray[pix] & 0xff0000ff);
    tempFrame[pix] = greyValue;
}
g_env->SetIntArrayRegion(frame, 0, frameSize, tempFrame);

//return the array setting a variable in java
g_env->SetObjectField(g_o, g_env->GetFieldID(g_class, "mFrame", "[I"), frame);

然后,Java方面:

//Somewhere in SurfaceView.surfaceCreated method
if(mBitmap == null)
    mBitmap = Bitmap.createBitmap(mImageWidth, mImageHeight, Bitmap.Config.ARGB_8888);

//Somewhere in View.onDraw method
if(mBitmap != null && nativeClass.mFrame != null){
    mBitmap.setPixels(nativeClass.mFrame, 0, mImageWidth, 0, 0, mImageWidth, mImageHeight);

    //Do some operations on the bitmap with mBitmap.setPixel()

    canvas.drawBitmap(mBitmap, srcRect, dstRect, null);
}

我想知道是否有办法加速进程,避免复制数组两次(首先从jintArray复制到int []然后从fromo int []复制到Bitmap),例如直接在Bitmap中写入,或者在JNI中创建一个Bitmap并将其传递给Android。 (我知道canvas有一个drawBitmap方法,它接受int []而不是Bitmap,但是该方法不接受Rects进行重新缩放,所以这是不可行的)

1 个答案:

答案 0 :(得分:3)

简单方法:

在Java代码中创建位图。 在本机代码中传递位图ref。 使用AndroidBitmap_lockPixels获取像素值数组。 用数据填充数组。 最后致电AndroidBitmap_unlockPixels

Hard way.