出现这个问题的原因是Android 12中限制了非堆内存的使用,因此需要对JNI的内存分配进行调整。
我们可以使用ANativeWindow_Buffer结构体中提供的方式来进行内存分配:
ANativeWindow_Buffer buffer; ANativeWindow_Buffer_create(&buffer, width, height, format, usage); if (buffer.bits == NULL) { // 内存分配失败 return false; }
其中,width,height,format和usage分别表示图像宽度、高度、像素格式和使用情况。如果内存分配成功,buffer.bits将指向分配的内存空间。
使用完buffer之后,需要记得释放内存:
ANativeWindow_Buffer_release(&buffer);
这种方式在Android 12中可以有效避免JNI malloc返回null的问题。