android ---Using java surface on the native side

本文介绍如何通过JNI在Android的Native层直接进行视频渲染,以此提高VoIP和视频播放器等应用的性能。主要步骤包括Java层创建Surface并传递给Native层,在Native层注册、提交和注销缓冲区。

对于 android上的 voip及视频播放器类应用,为提高效率,把视频数据的渲染工作放在native层对提供性能有很大帮助,只需在java层创建一块surface,剩下的工作由native层处理,

无需转换为rgb格式到java层,画面控制仍然交给应用层。

大致过程:

java层创建surface,jni方式传给native层,native层在此surface上渲染

native层大致过程:

1. registerBuffers

2. postBuffer

3. unregisterBuffer


问题:native层获取Isurface没有权限,因为其是surface类的私有函数,需要修改framework 代码。

some good links :


http://matthiyosi.blogspot.com/2009/10/using-surface-in-android-native-code.html


http://matthiyosi.blogspot.com/2009/10/using-android-mediaplayer-framework-to.html

https://groups.google.com/forum/?fromgroups#!topic/android-developers/W3nVRXG4JD0

怎么解决错误PROCESS ENDED (18378) for package com.example.app2526 ---------------------------- 2025-05-27 18:30:22.636 348-1216 BufferQueueProducer surfaceflinger E [SurfaceView - com.example.app2526/com.example.app2526.MainActivity#0](id:15c00000522,api:3,p:432,c:348) cancelBuffer: BufferQueue has been abandoned 2025-05-27 18:30:22.670 348-1216 BufferQueueProducer surfaceflinger E [SurfaceView - com.example.app2526/com.example.app2526.MainActivity#0](id:15c00000522,api:3,p:432,c:348) connect: BufferQueue has been abandoned ---------------------------- PROCESS STARTED (18536) for package com.example.app2526 ---------------------------- 2025-05-27 18:30:25.230 18536-18536 NetworkSecurityConfig com.example.app2526 D No Network Security Config specified, using platform default 2025-05-27 18:30:25.230 18536-18536 NetworkSecurityConfig com.example.app2526 D No Network Security Config specified, using platform default 2025-05-27 18:30:25.310 18536-18561 libEGL com.example.app2526 D loaded /vendor/lib/egl/libEGL_emulation.so 2025-05-27 18:30:25.312 18536-18561 libEGL com.example.app2526 D loaded /vendor/lib/egl/libGLESv1_CM_emulation.so 2025-05-27 18:30:25.316 18536-18561 libEGL com.example.app2526 D loaded /vendor/lib/egl/libGLESv2_emulation.so 2025-05-27 18:30:25.334 18536-18536 AppCompatDelegate com.example.app2526 D Checking for metadata for AppLocalesMetadataHolderService : Service not found 2025-05-27 18:30:25.395 18536-18536 example.app252 com.example.app2526 W Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed) 2025-05-27 18:30:25.395 18536-18536 example.app252 com.example.app2526 W Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed) 2025-05-27 18:30:25.643 18536-18559 HostConnection com.example.app2526 D HostConnection::get() New Host Connection established 0xd4552b50, tid 18559 2025-05-27 18:30:25.647 18536-18559 HostConnection com.example.app2526 D HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_vulkan ANDROID_EMU_deferred_vulkan_commands ANDROID_EMU_vulkan_null_optional_strings ANDROID_EMU_vulkan_create_resources_with_requirements ANDROID_EMU_YUV_Cache ANDROID_EMU_vulkan_ignored_handles ANDROID_EMU_has_shared_slots_host_memory_allocator ANDROID_EMU_vulkan_free_memory_sync ANDROID_EMU_vulkan_shader_float16_int8 ANDROID_EMU_vulkan_async_queue_submit ANDROID_EMU_sync_buffer_data ANDROID_EMU_vulkan_async_qsri ANDROID_EMU_read_color_buffer_dma GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_2 2025-05-27 18:30:25.648 18536-18559 OpenGLRenderer com.example.app2526 W Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without... 2025-05-27 18:30:25.663 18536-18559 EGL_emulation com.example.app2526 D eglCreateContext: 0xd455b6e0: maj 2 min 0 rcv 2 2025-05-27 18:30:25.696 18536-18559 EGL_emulation com.example.app2526 D eglMakeCurrent: 0xd455b6e0: ver 2 0 (tinfo 0xd4646730) (first time) 2025-05-27 18:30:25.738 18536-18559 Gralloc4 com.example.app2526 I mapper 4.x is not supported 2025-05-27 18:30:25.739 18536-18559 HostConnection com.example.app2526 D createUnique: call 2025-05-27 18:30:25.739 18536-18559 HostConnection com.example.app2526 D HostConnection::get() New Host Connection established 0xd455ae90, tid 18559 2025-05-27 18:30:25.794 18536-18559 HostConnection com.example.app2526 D HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_direct_mem ANDROID_EMU_host_composition_v1 ANDROID_EMU_host_composition_v2 ANDROID_EMU_vulkan ANDROID_EMU_deferred_vulkan_commands ANDROID_EMU_vulkan_null_optional_strings ANDROID_EMU_vulkan_create_resources_with_requirements ANDROID_EMU_YUV_Cache ANDROID_EMU_vulkan_ignored_handles ANDROID_EMU_has_shared_slots_host_memory_allocator ANDROID_EMU_vulkan_free_memory_sync ANDROID_EMU_vulkan_shader_float16_int8 ANDROID_EMU_vulkan_async_queue_submit ANDROID_EMU_sync_buffer_data ANDROID_EMU_vulkan_async_qsri ANDROID_EMU_read_color_buffer_dma GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_host_side_tracing ANDROID_EMU_gles_max_version_2 2025-05-27 18:30:27.372 18536-18536 VideoPlayer com.example.app2526 E 初始化错误 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.VideoView.setMediaController(android.widget.MediaController)' on a null object reference at com.example.app2526.Fragment_3.initVideoPlayer(Fragment_3.java:125) at com.example.app2526.Fragment_3.onViewCreated(Fragment_3.java:103) at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2987) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100) at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1971) at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:311) at androidx.fragment.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:274) at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244) at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:669) at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:631) at androidx.viewpager.widget.ViewPager.setCurrentItem(ViewPager.java:612) at com.example.app2526.MainActivity$2.onNavigationItemSelected(MainActivity.java:87) at com.google.android.material.navigation.NavigationBarView$1.onMenuItemSelected(NavigationBarView.java:301) at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:836) at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:159) at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:987) at com.google.android.material.navigation.NavigationBarMenuView$1.onClick(NavigationBarMenuView.java:141) at android.view.View.performClick(View.java:7448) at android.view.View.performClickInternal(View.java:7425) at android.view.View.access$3600(View.java:810) at android.view.View$PerformClick.run(View.java:28305) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 2025-05-27 18:30:27.373 18536-18536 Compatibil...geReporter com.example.app2526 D Compat change id reported: 147798919; UID 10189; state: ENABLED 2025-05-27 18:30:30.266 18536-18536 VideoPlayer com.example.app2526 E 初始化错误 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.VideoView.setMediaController(android.widget.MediaController)' on a null object reference at com.example.app2526.Fragment_3.initVideoPlayer(Fragment_3.java:125) at com.example.app2526.Fragment_3.onViewCreated(Fragment_3.java:103) at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2987) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100) at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1971) at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:311) at androidx.fragment.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:274) at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244) at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:669) at androidx.viewpager.widget.ViewPager.setCurrentItemInternal(ViewPager.java:631) at androidx.viewpager.widget.ViewPager.setCurrentItem(ViewPager.java:612) at com.example.app2526.MainActivity$2.onNavigationItemSelected(MainActivity.java:87) at com.google.android.material.navigation.NavigationBarView$1.onMenuItemSelected(NavigationBarView.java:301) at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:836) at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:159) at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:987) at com.google.android.material.navigation.NavigationBarMenuView$1.onClick(NavigationBarMenuView.java:141) at android.view.View.performClick(View.java:7448) at android.view.View.performClickInternal(View.java:7425) at android.view.View.access$3600(View.java:810) at android.view.View$PerformClick.run(View.java:28305) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 2025-05-27 18:30:30.678 18536-18567 ProfileInstaller com.example.app2526 D Installing profile for com.example.app2526
最新发布
05-29
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值