gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:49:14 24 4
gpt4 key购买 nike

我在 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 中创建位图并将其传递给 Android。(我知道 canvas 有一个 drawBitmap 方法接受 int[] 而不是 Bitmap,但是那个方法不接受 Rects 来重新缩放,所以这是不可行的)

最佳答案

简单的方法:

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

Hard way.

关于android - 在 Android 位图中直接从 JNI 传递字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14276655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com