您现在的位置是:首页 >学无止境 >Android ANativeWindow 渲染画面网站首页学无止境

Android ANativeWindow 渲染画面

wk灬丨 2024-06-17 10:32:20
简介Android ANativeWindow 渲染画面

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 接口,开发人员可以直接与底层的图形系统交互,实现高性能的图像渲染和处理。它在游戏开发、图像处理和视频播放等领域中得到广泛应用。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。