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

在Android位图中直接从JNI传递字节数组,android,bitmap,java-native-interface,Android,Bitmap,Java Native Interface,我在JNI中有一个作为字节数组的灰度图像,我需要将其传递给Android以显示在屏幕上。目前我的代码如下:我将字节数组复制到JNI中的int数组,然后使用该数组设置位图的像素: JNI方: jintArray frame = g_env->NewIntArray(frameSize); int tempFrame[frameSize]; for(int pix = 0; pix < frameSize; pix++){ //convert every byte to int

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

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);
我想知道是否有办法加快这个过程,避免将数组复制两次(先从jintArray复制到int[],然后从O int[]复制到位图),例如直接在位图中写入,或者在JNI中创建位图并将其传递给Android。 (我知道canvas有一个drawBitmap方法,它接受int[]而不是Bitmap,但该方法不接受用于重新缩放的RECT,因此不可行)

简单方法:

用Java代码创建位图。 在本机代码中传递位图引用。 使用
AndroidBitmap\u lockPixels
获取像素值数组。 用数据填充数组。 调用
AndroidBitmap\u在末尾解锁像素


恐怕我不能。。。我使用回调函数从另一个线程接收图像。。。尽管如此,我仍然可以在其他函数中初始化位图引用,所以我将尝试这样做。我不相信这种艰难的方式,我似乎记得从jni调用java方法在计算上是昂贵的,但我也要检查一下。PS:我用简单的方式做了,它正确地工作了;我想这会给我的参考表带来一些问题。。。但这是另一个问题,因此我将就此提出另一个问题。
//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);
}