我应该为android位图释放内存吗?

我应该为android位图释放内存吗?,android,android-ndk,Android,Android Ndk,我正在将android应用程序中的窗口缓冲区从本机端传递到java端 AndroidBitmapInfo info; void saveBufferToBitmap(JNIEnv *env, ANativeWindow_Buffer *buffer, jobject bitmap) { void *pixels; LOGI(10, "saving buffer to bitmap"); if (AndroidBitmap_getInfo(env, bitmap, &

我正在将android应用程序中的窗口缓冲区从本机端传递到java端

AndroidBitmapInfo info;

void saveBufferToBitmap(JNIEnv *env, ANativeWindow_Buffer *buffer, jobject bitmap) {
    void *pixels;

    LOGI(10, "saving buffer to bitmap");

    if (AndroidBitmap_getInfo(env, bitmap, &info) < 0) {
        LOGE(10, "Failed to get bitmap info");
            return;
    }

    if (AndroidBitmap_lockPixels(env, bitmap, &pixels) < 0) {
        LOGE(10, "Failed to lock pixles for bitmap");
        return;
    }

    int i, scan_length;
    scan_length = buffer->width * 4;

    memcpy(pixels, buffer->bits, buffer->width * buffer->height * 4); // 4 = (rgba)

    AndroidBitmap_unlockPixels(env, bitmap);

    //free(pixels); // here
}
AndroidBitmapInfo信息;
void saveBufferToBitmap(JNIEnv*env、ANativeWindow\u Buffer*Buffer、jobject位图){
空*像素;
LOGI(10,“将缓冲区保存到位图”);
if(AndroidBitmap_getInfo(环境、位图和信息)<0){
LOGE(10,“无法获取位图信息”);
返回;
}
if(AndroidBitmap_lockPixels(环境、位图和像素)<0){
LOGE(10,“未能锁定位图的像素”);
返回;
}
int i,扫描长度;
扫描长度=缓冲区->宽度*4;
memcpy(像素,缓冲区->位,缓冲区->宽度*缓冲区->高度*4);//4=(rgba)
AndroidBitmap_解锁像素(环境、位图);
//自由(像素);//此处
}

我应该在
//这里释放像素缓冲区吗?AndroidBitmap\u lockPixels/AndroidBitmap\u unlockPixels是否将缓冲区复制到位图?

作为一般规则,您通常不应该
释放
您自己没有创建的指针。从中获取指针的库调用可以使用任何分配,也可以只传递指向内部数据结构的指针。在这种情况下,第二种可能性很大

查看来源的文档:

/**
 * Given a java bitmap object, attempt to lock the pixel address.
 * Locking will ensure that the memory for the pixels will not move
 * until the unlockPixels call, and ensure that, if the pixels had been
 * previously purged, they will have been restored.
 *
 * If this call succeeds, it must be balanced by a call to
 * AndroidBitmap_unlockPixels, after which time the address of the pixels should
 * no longer be used.
 *
 * If this succeeds, *addrPtr will be set to the pixel address. If the call
 * fails, addrPtr will be ignored.
 */
 int AndroidBitmap_lockPixels(JNIEnv* env, jobject jbitmap, void** addrPtr);
资料来源:

这告诉我们,在AndroidBitmap_解锁像素后,不要对
像素做任何事情,而且绝对不能
释放它