【问题标题】:How to pass a surface in Android to native code?如何将 Android 中的表面传递给本机代码?
【发布时间】:2015-08-31 02:10:22
【问题描述】:

我想使用 Native Window,所以我试图调用 ANativeWindow_fromSurface,但它需要一个用于表面的 jobject。我假设最好的方法是在调用 onSurfaceCreated 时传递它,即:

public class RendererWrapper implements Renderer {
     @Override
     public void onSurfaceCreated(GL10 gl, EGLConfig config) {
     // (Some sort of code that would create a surface object)

     //This is a native function that will use ANativeWindow_fromSurface
     cOnSurfaceCreated(surface);
}

但我不知道我应该使用什么特定对象,也不知道如何访问它。

编辑:在本例中,我正在尝试执行类似于 NativeWindow API 的操作:https://vec.io/posts/how-to-render-image-buffer-in-android-ndk-native-code,这样我就可以从原生 c 代码直接写入屏幕。

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

    简单地说,你需要传递一个 Surface。我希望您的 onSurfaceCreated() 方法在创建 Surface 之后 被调用,所以我不太了解您显示的代码的结构。

    如果您正在使用 SurfaceTexture,请参阅this question 的答案。

    【讨论】:

    • 如何访问与设备屏幕对应的 Surface?这就是 Surfaces 所做的吗?我环顾四周,发现我可以通过调用SurfaceView surfaceView = new SurfaceView(context) 获得表面view(我可以很好地访问上下文)。但是,当我寻找如何使用 Surface 来做到这一点时,它需要一个 SurfaceTexture,而后者又需要一个 texName,而我无法弄清楚其中任何一个是什么,或者我将如何使用/访问它们。
    • 详情请见source.android.com/devices/graphics/architecture.html。例如,请参阅 Grafika (github.com/google/grafika)。没有设备屏幕之类的东西(可能在“恢复”模式下除外)。 Surface 有生产者端和消费者端;对于 SurfaceView,应用程序是生产者,系统图形合成器是消费者。你在 Surface 上绘图,SurfaceFlinger 将它放到显示器上。在有根设备上,您可以关闭整个应用程序框架并直接访问 HardwareComposer,但这很少有用。
    猜你喜欢
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    相关资源
    最近更新 更多