ANativeWindow 是 Android NDK(Native Development Kit)提供的一个C/C++编程接口,用于与底层的图形系统进行交互,实现图像渲染和处理等功能。
使用方法:上层用 SurfaceView,传递 SurfaceView 的 Surface 给 native 层,在 native 层中把 Surface 转换为 ANativeWindow 进行渲染
例如,用 ANativeWindow 渲染一个纯色页面:
MainActivity:
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback{
static {
System.loadLibrary("native-lib");
}
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.surfaceView.getHolder().addCallback(this);
}
@Override
public void surfaceCreated(@NonNull SurfaceHolder holder) {
}
@Override
public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
setSurface(holder.getSurface());
}
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
}
public native void setSurface(Surface surface);
}
可以看到 setSurface 方法是一个 native 函数,就是把上层的 Surface 传递给底层
native 层:
extern "C"
JNIEXPORT void JNICALL
Java_xxx_MainActivity_setSurface(JNIEnv *env, jobject thiz, jobject surface) {
ANativeWindow* window = ANativeWindow_fromSurface(env, surface);
if (window == NULL) { // 处理无效的 ANativeWindow 对象
return;
}
int32_t width = ANativeWindow_getWidth(window);
int32_t height = ANativeWindow_getHeight(window);
ANativeWindow_setBuffersGeometry(window, width, height, WINDOW_FORMAT_RGBA_8888);
ANativeWindow_Buffer buffer;
if (ANativeWindow_lock(window, &buffer, NULL) == 0) {
uint32_t* pixels = static_cast<uint32_t*>(buffer.bits);
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
pixels[y * buffer.stride + x] = 0xFFFF0000;
}
}
ANativeWindow_unlockAndPost(window);
}
ANativeWindow_release(window); // 释放
}
①ANativeWindow_fromSurface():
将 Android 的 Surface 对象转换为 ANativeWindow 对象,以便进行图像渲染和处理。
②ANativeWindow_setBuffersGeometry():
用于设置 ANativeWindow 的缓冲区几何属性。告诉系统如何分配和管理 ANativeWindow 的图像缓冲区。
③ANativeWindow_lock():
用于锁定 ANativeWindow 的图像缓冲区 和 获取操作缓冲区的像素数据,并确保数据一致性和线程安全性。
④ANativeWindow_unlockAndPost():
解锁 ANativeWindow 的图像缓冲区,并通知系统图像缓冲区已被修改,以便进行后续处理和刷新操作。
通过使用 ANativeWindow 接口,开发人员可以直接与底层的图形系统交互,实现高性能的图像渲染和处理。它在游戏开发、图像处理和视频播放等领域中得到广泛应用。