我应该为android位图释放内存吗?
我正在将android应用程序中的窗口缓冲区从本机端传递到java端我应该为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, &
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_解锁像素后,不要对像素做任何事情,而且绝对不能释放它