JNI参数传递|Surface

char* Get_Surface(JNIEnv *env, jclass cls, jobject param, int sdk_version)
{
        // Java层
        jfieldID surface = env->GetFieldID(cls, "mSurface", "Landroid/view/Surface;");
        jobject surface_cls = env->GetObjectField(param, surface);

        // Native层
       jclass surface_class = env->FindClass("android/view/Surface");
       jfieldID surface_native = env->GetFieldID(surface_class, "mSurface", "I"); //"I"指整型

        // the JNI also supports other functions such as GetIntField and SetFloatField for accessing instance fields of primitive types.
        return (char*)(Surface*)env->GetIntField(surface_cls, surface_native<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这是一个比较复杂的例子,需要结合Java和C++代码实现。下面是大致的实现思路: 1. 在Java代码中创建一个Surface对象,并将其传递给C++代码进行显示。 ```java // 创建Surface对象 SurfaceView mSurfaceView = findViewById(R.id.surface_view); Surface mSurface = mSurfaceView.getHolder().getSurface(); // 将Surface对象传递给C++代码 nativeInit(mSurface); ``` 2. 在C++代码中,将传递过来的Surface对象转换为EGLSurface,并创建OpenGL上下文。 ```c++ void nativeInit(JNIEnv *env, jobject surface) { // 将Java层传递Surface对象转换为EGLSurface ANativeWindow *window = ANativeWindow_fromSurface(env, surface); EGLSurface eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, window, NULL); ANativeWindow_release(window); // 创建OpenGL上下文 EGLContext eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, contextAttribs); eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext); // 初始化OpenGL渲染器 renderer = new OpenGLRenderer(); renderer->init(); } ``` 3. 在C++代码中,通过OpenGL渲染器将视频帧绘制到EGLSurface上。 ```c++ void renderFrame() { // 绘制视频帧 renderer->drawFrame(); // 将渲染结果刷新到屏幕上 eglSwapBuffers(eglDisplay, eglSurface); } ``` 4. 在Java代码中,通过MediaPlayer获取视频数据,并将其传递给C++代码进行渲染。 ```java // 创建MediaPlayer对象 MediaPlayer mMediaPlayer = new MediaPlayer(); mMediaPlayer.setDataSource(videoPath); // 准备MediaPlayer mMediaPlayer.prepare(); mMediaPlayer.start(); // 获取视频帧数据 Bitmap bitmap = Bitmap.createBitmap(videoWidth, videoHeight, Bitmap.Config.ARGB_8888); mMediaPlayer.getFrameAtTime(currentTimeUs, bitmap); // 将视频帧数据传递给C++代码 nativeRenderFrame(bitmap); ``` 5. 在C++代码中,将传递过来的视频帧数据转换为OpenGL纹理,并通过OpenGL渲染器将其绘制到EGLSurface上。 ```c++ void nativeRenderFrame(JNIEnv *env, jobject bitmap) { // 将Java层传递的Bitmap对象转换为OpenGL纹理 GLuint textureId; glGenTextures(1, &textureId); glBindTexture(GL_TEXTURE_2D, textureId); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); // 绘制视频帧 renderer->drawFrame(textureId); // 将渲染结果刷新到屏幕上 eglSwapBuffers(eglDisplay, eglSurface); // 释放OpenGL纹理 glDeleteTextures(1, &textureId); } ``` 需要注意的是,这只是一个简单的例子,实际的实现可能会更加复杂,需要考虑如何处理视频帧数据的传递、纹理的创建和释放、OpenGL渲染器的初始化等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值