转载请以链接形式标明出处: 本文出自:103style的博客 本文操作以 Android Studio 3.5 版本为例 ---- NDK开发文章汇总 ---- 功能介绍 参考 OpenGL...GLESv2) else () set(OPENGL_LIB GLESv3) endif (${ANDROID_PLATFORM_LEVEL} LESS 11) target_link_libraries...(native-gles3 android EGL ${OPENGL_LIB} log) 创建修改 相关 java 文件(MainActivity.../gl3ext.h> #include android/log.h> #include "LogUtils.h" LogUtils.h 选中 GLES3Render 中报红的 native 方法,按...编写 顶点着色器 和 片段着色器 源码: /** * 顶点着色器源码 */ auto gl_vertexShader_source = "#version 300 es\n"
二、创建 OpenGL ES 渲染线程 与 Java 层一样,先对 EGL 相关的内容进行封装。...EGLSurface 对 EGLCore 进一步封装,主要是对 EGLCore 创建的 EGLSurface 进行管理,并对外提供更加简洁的调用方法。...EGL 工具), 并调用了它的 Init 方法进行初始化。..., m_window_height); } 可以看到,ANativeWindow 窗口的初始化和《Android FFmpeg视频解码播放》中直接使用本地窗口显示视频画面时一样的。...最后的几个 virtual 函数,类似 Java 的 abstract 函数,需要子类实现。
C++ 和 Android 本地 Activity 初探 简介 我会带你完成一个简单的 Android 本地 Activity。我将介绍一下基本的设置,并尽力将进一步学习所需的工具提供给你。...最后我们通过 target_link_libraries 告诉 CMake,helloworld-c 要依赖 native_app_glue、native_app_glue 和被命名为 log-lib...如此可以在我们的 C++ 工程中引用本地应用的逻辑。...这里你可以对不同的 Android 架构平台做很多处理,但对最近版本的 Android 来说,添加 EGL 和 GLESv3 到你的目标是一个不错的操作。...:github.com/googlesampl… CMake 是我在 Android 上使用 C++ 时首选的构建系统,可以在这里找到参考页面:cmake.org/ 如果你刚开始学 CMake,或者你对以
每个状态都有本身默认的缺省值,可以通过相关的查询和设置函数进行相关的查询和设置。...我们可以通过这个函数获得egl的版本号。 3....中的错误,用户在每个egl函数调用结束都需要调用这个函数。...bShaderCompiled) { // 错误发生,首先获取错误的长度 glGetShaderiv(uiFragShader, GL_INFO_LOG_LENGTH...; Android的HAL层提供了Gralloc,分为fb和gralloc两个设备。
可以在JVM调试的时候,对给线程进行调试 可以传入解构函数 就是讲需要通过JNI调用的Native方法的函数都缓存起来。...在SDLSurface的对应的生命周期中,会调用handleNativeState对Native的State进行修改。...library和主函数的名称。...其实对应的是main方法 SDL_main中的宏 SDL_main指向main.png 项目中native-lib-su.cpp中对应的主函数名称是main .png 进入到nativeRunMain...SDL_RENDER_DISABLED */ 经过一系列对window flag的判断,最终走到了创建GLContext 和 MakeCurrent 上 GLES2_LoadFunctions 接着设置刷新率
之前的两篇文章主要介绍了音视频SDK中的线程设计和消息队列,其实对那些想从Android转向音视频开发的同学来说,NDK方面的知识是不得不提的“前置条件”,因为音视频开发的主要是C/C++开发,也许有些同学会反驳...里面放着include和lib文件夹,分别表示Android平台下的头文件的库文件,我们编译的任何文件都可能会引用到这个文件架下面的库。这个链接是不能少的。...CMake用于使用简单的平台和编译器独立配置文件来控制软件编译过程,并生成可在您选择的编译器环境中使用的本机 makefile 和工作区。...JNI是全称是Java native interface,是Android提供的Java和Native代码(C和C++)交互和联系的方式。...在原生方法返回后,即使对象本身继续存在,该引用也无效。 这适用于 jobject 的所有子类,包括 jclass、jstring 和 jarray。就和我们所说的局部变量有点像。
,CMake的C++运行时默认值为c++_static,CMake和独立工具链默认启用C++异常,默认启用 RTTI。...CMake使用工具链来执行编译、链接等任务,对不同语言需要使用不同的工具链; NDK的工具链文件位于 NDK目录中的 {NDK_root}/build/cmake/android.toolchain.cmake...项目 如果项目中包含多个CMake项目,可以使用一个 CMakeLists.txt 文件作为顶级 CMake 构建脚本,并添加其他 CMake 项目作为此构建脚本的依赖项。...log) 下面主要列举一些常用的NDK native api: c库: 和 等标准 C11 库头文件;无需显示链接; c++库:提供 C++17 支持; log:...4.1 JavaVM 和 JNIEnv JNI 定义了两个关键数据结构“JavaVM”和“JNIEnv”,两者本质上都是指向函数表的二级指针。
[图片] 一、Android Studio Native 开发新特性扫描 提供对 CMake(官方默认)、ndk-build 两种构建方式的支持。...以 LLDB 为 Native 层的调试器,提供跨 Java 层和 Native 层的 Hybrid Debugger。 开发环境提供对 Native 代码编辑的支持。...对 Native 方法查找引用,可以看到 IDE 同时列出 Java 层和 Native 层的方法(函数)及其引用 新特性要求 Android Gradle Build Tools 版本必须为 2.2.0...开发者需提供 Android.mk 和可选的 Application.mk,并更新 build.gradle。...1. android/externalNativeBuild 块 如果通过上述“方法一”链接了 Native 源代码,build.gradle 将在 android 块下新增: externalNativeBuild
共享上下文实现多线程渲染 EGL 概念回顾 EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用: 与设备的原生窗口系统通信; 查询绘图表面的可用类型和配置...egl、opengles 和设备之间的关系 图片中: Display (EGLDisplay) 是对实际显示设备的抽象; Surface(EGLSurface)是对用来存储图像的内存区域 FrameBuffer...ES 绘图的一些状态信息; 在 Android 平台上开发 OpenGL ES 应用时,类 GLSurfaceView 已经为我们提供了对 Display , Surface , Context 的管理...当然我们也可以自己实现对 EGL 的封装,本文就是在 Native 层对 EGL 进行封装,不借助于 GLSurfaceView ,实现图片后台渲染,利用 GPU 完成对图像的高效处理。...多线程渲染 类比 Android Java 层的 Looper 类,我们在 C++ 实现 Looper 用于创建新线程并管理线程中的消息。
“Y”表示明亮度,“U”和“V”则是色度、浓度相对我们都比较熟悉的编码格式RGB,RGB诉求于人眼对色彩的感应,YUV则着重于视觉对于亮度的敏感程度。...native-lib GLESv2 EGL android...EGL是渲染API(如OpenGL, OpenGL ES, OpenVG)和本地窗口系统之间的接口。EGL可以理解为OpenGl ES ES和设备之间的桥梁,EGL是为OpenGl提供绘制表面的。...//对sampler变量,使用函数glUniform1i和glUniform1iv进行设置 glUniform1i(glGetUniformLocation(program, "yTexture...//yuv视频宽高 int width = 640; int height = 360; //通过 glBindTexture 函数将纹理目标和以texts[0]为ID的纹理对象绑定后,对纹理目标所进行的操作都反映到该纹理对象上
[OpenGL ES 共享上下文实现多线程渲染] EGL 概念回顾 EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用: 与设备的原生窗口系统通信...[egl、opengles 和设备之间的关系] 图片中: Display(EGLDisplay) 是对实际显示设备的抽象; Surface(EGLSurface)是对用来存储图像的内存区域 FrameBuffer...ES 绘图的一些状态信息; 在 Android 平台上开发 OpenGL ES 应用时,类 GLSurfaceView 已经为我们提供了对 Display , Surface , Context 的管理...当然我们也可以自己实现对 EGL 的封装,本文就是在 Native 层对 EGL 进行封装,不借助于 GLSurfaceView ,实现图片后台渲染,利用 GPU 完成对图像的高效处理。...多线程渲染 类比 Android Java 层的 Looper 类,我们在 C++ 实现 Looper 用于创建新线程并管理线程中的消息。
, -0.5806, 0.0 ) *yuv; 1.2 OpenGL ES基础知识 我们在第二个系列中已经对OpenGLES的基本流程和GLSL语法以及绘制各种图形、矩阵变换等进行过学习实践。...当然可以,音频OpenGL ES提供了Java和native的支持,我们完全可以在native层进行渲染,只不过nativew层没有类似GLSuerfaceView即封装好的EGL环境,这样就需要我们自己创建...JNI错误。...; 四、资料 音视频学习 (八) 掌握视频基础知识并使用 OpenGL ES 2.0 渲染 YUV 数据 YUV RGB 转换算法 Android平台上基于OpenGl渲染yuv视频 Android...解决遇到的解码和渲染不同步导致跳帧、渲染时出现绿屏 花屏、渲染画面时颠倒的等问题 感谢你的阅读 篇外话: 原计划时接下来几篇是Native层渲染、音视频同步、编码、倍速播放、rtmp推拉流等。
(不同GPU厂商实现不同,Android源码自带的是软件实现的,只具有参考意义)(Fence机制辅助GPU CPU同步) 第四阶段:swapBuffers,并通知SurfaceFlinger图层合成 第五阶段...线程是一个单例,同一个进程只有一个RenderThread,RenderProxy 通过mRenderThread引用该单例,将来需要提交任务的时候,直接通过该引用向RenderThread的Queue...Surface的引用的,同时swap的时候,是能通知consumer的 EGLSurface surface = cnx->egl.eglCreateWindowSurface(...return EGL_TRUE; } 上面的nativeWindow其实就是Surface: int Surface::dequeueBuffer(android_native_buffer_t** buffer...转换成标准OpenGL命令,并isssue给GPU Render线程通过swapbuffer通知GPU(待研究),同时完成向SurfaceFlinger画布数据的提交 作者:看书的小蜗牛 Android
系统开机动画支持功能 // 注意:不同的android版本,配置方法可能不同,该配置是Android6.0的方法 配置debug.sf.nobootanimation 为0 若要关闭开机动画功能,在device...目录下的mk文件中配置,确保系统开机默认值为1;若要支持动画,不用配置,默认为0 启动开机动画 定义服务 开机动画在init.rc中定义为native service,如 service shutdownanim...eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglDestroyContext(mDisplay...因此必须留意文件名命令 Animation::Frame frame; frame.name = leaf; frame.map = map; // add的同时和已经保存的文件比较...动画播放文件乱序 原因: 文件命名错误,仅是简单的1、2、3、。。。
SystemServer的main函数首先调用init1来启动本地服务,init1函数通过JNI调用C语言中的system_init()函数来实现服务启动。...模板类,BinderService类的instantiate()函数就是构造对应类型的服务对象,并注册到ServiceManager进程中。...return UNKNOWN_ERROR; } return NO_ERROR; } 该函数就是创建一个线程,并运行现在执行函数_threadLoop int Thread::_threadLoop...bootanimation.zip组成,压缩包里面包含数张png格式的图片,还有一个desc.txt的文本文档,开机时按desc.txt里面的指令,屏幕上会按文件名称顺序连续的播放一张张的图片,就像播放原始的胶带影片一样...folder1和folder2文件夹内包含的是两个动画的系列图片,图片为PNG格式。
视频解码播放和视频滤镜 1 OpenGL ES 渲染解码帧 经过上面几节的介绍,我们对音视频的解码过程已经比较熟悉了。本文要用 OpenGL 实现视频的渲染,这里再回顾下视频的解码流程: ?...由于本文是面向初学者快速上手 FFmpeg 开发,我们直接利用 Android GLSurfaceView 类创建 OpenGL 渲染环境,GLSurfaceView 类已经封装了 EGL 创建渲染上下文的操作...,并启动了一个独立的渲染线程,完全符合我们渲染视频解码帧的需求。...GLSurfaceView 类 Renderer 接口对应渲染的三个关键函数,我们通过 JNI 延伸到 Native 层: @Override public void onSurfaceCreated...渲染效果 2 添加视频滤镜 这里又回到了 OpenGL ES 开发领域,对这一块感兴趣的同学可以参考这篇Android OpenGL ES 从入门到精通系统性学习教程。
// 配置数组,主要是配置RAGA位数和深度位数 // 两个为一对,前面是key,后面是value // 数组必须以EGL14.EGL_NONE结尾 val...配置上下文getConfig: 根据选择的EGL版本,配置版本标志 初始化配置列表,配置渲染的rgba位数和深度位数,两个为一对,前面一个为类型,后面为值,并且必须以EGL14.EGL_NONE作为结尾...Android 指定的标志EGL_RECORDABLE_ANDROID 告诉EGL它创建的surface必须和视频编解码器兼容。...注:当页面重新回到前台时,会重新创建surface,这时只要重新创建EGLSurface,并绑定上下文和EGLSurface,就可以继续渲染画面,无需开启新的渲染线程。...四、参考文章 OpenGL 之 EGL 使用实践 从源码角度剖析Android系统EGL及GL线程
即使三角形覆盖了部分屏幕像素,但是采样点没被覆盖,就不会生成片段。 由于屏幕像素总量的限制,有些边上的像素能被渲染出来,而有些则不会。结果就是我们渲染出的基本图形的非光滑边缘产生了上图的锯齿边。...多重采样抗锯齿原理 多重采样抗锯齿通过在渲染过程中对图像进行额外的抽样来解决这个问题。...多重采样抗锯齿实现 通过 EGL 设置多重采样 我们知道 EGL 创建 OpenGL 的渲染上下文,会调用一系列的 egl 函数,例如 eglGetDisplay() ,eglInitialize()...EGL_SAMPLES, 4, //设置每个片段的采样点数 EGL_NONE }; 然后就是正常的流程,创建渲染表面和 EGLContext。...C++ int maxSamples = 0; glGetIntegerv(GL_MAX_SAMPLES, &maxSamples); Android 平台可以直接通过 GLSurfaceView 中的内置函数
您可能想知道cmake_android_arm.sh构建脚本在做什么。 实际上,它只是创建一个构建目录并运行 CMake 命令以使用 OpenCV 的特定配置填充该目录。...支持库提供向后兼容性,因此即使用户设备运行的是旧版操作系统,应用也可以使用 Android 的许多新功能。 注意 请记住,工作空间还必须包含 OpenCV 库项目。...我们对这种方法的实现将特征检测器,描述符提取器和描述符匹配器应用于源图像的灰度版本。 然后,我们调用帮助程序函数,该函数查找被跟踪目标的四个角(如果有),并绘制四边形轮廓。...每当我们从 Java 端进行 JNI 函数调用时,都会隐式传递这两个参数。 我们的newSelf函数的作用是创建一个 C++ 对象,并为 Java 端提供对该对象的引用。...函数名称,返回类型和参数类型必须与SecondSightJNI.cpp中的函数名称匹配。 (否则,我们将在运行时出现错误。)
但是不必担心,一是有了 CMake ,二是对于 C/C++ 的基本使用其实和 Java 差不多,本系列涉及到的,也都是对 C/C++ 的基础使用,毕竟,高级的我也不会不是吗?哈哈哈~~ 1....往上一句代码,用 external 声明了一个外部引用的方法 stringFromJNI() ,这个方法和 C/C++ 层的代码是对应的。...添加、链接 FFmpeg so 库 上面已经把 so 和 头文件 放置到对应的目录中了,但是编译器是不会把它们编译、链接、并打包到 Apk 中的,我们还需要在 CMakeLists.txt 中显性的把相关的...so 添加和链接起来。...native-lib.cpp ) # 指定编译目标库时,cmake要链接的库 target_link_libraries( # 指定目标库,native-lib
领取专属 10元无门槛券
手把手带您无忧上云