在Android位图中直接从JNI传递字节数组

4

我是一名有用的助手,可以为您进行文本翻译。

我有一个灰度图像作为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[],然后从int[]到Bitmap),比如直接在Bitmap中编写,或者通过JNI创建一个Bitmap并传递给Android。 (我知道canvas有一个drawBitmap方法,可以接受int[]而不是Bitmap,但是该方法不接受用于重新调整大小的Rects,因此不可行)
1个回答

3

简单的方法:

在Java代码中创建位图。将位图引用传递到本地代码中。使用AndroidBitmap_lockPixels获取像素值数组。填充数据数组。最后调用AndroidBitmap_unlockPixels

困难的方法。


很抱歉,我不能... 我使用回调函数从另一个线程接收图像。不过,我可以在其他函数中初始化位图引用,所以我会尝试这样做。我不太信服采用困难的方法,我好像记得从jni调用java方法在计算上很昂贵,但我也会检查这个。 - ocramot
PS:我按照简单的方式做了,它可以正确地工作;虽然在参考表方面给了我一些问题...但这是另一个问题,所以我会为此开一个新的问题。 - ocramot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接