三、MagicCamera3#OpenGL滤镜

OpenGLJniLib

OpenGLJniLib是我们通过kotlin使用OpenGL的核心衔接处

kotlin代码中使用到OpenGLJniLib的地方如下图:


三、MagicCamera3#OpenGL滤镜_第1张图片
OpenGLJniLib.png

kotlin一共调用了8个函数。

object OpenGLJniLib{
    init {
        System.loadLibrary("magicjni")
    }
    /**
     * 初始化magicBaseView
     */
    external fun magicBaseInit(surface:Surface, width:Int, height:Int, manager: AssetManager):Int
    /**
     * 绘制
     */
    external fun magicBaseDraw(matrix:FloatArray)
    external fun magicBaseRelease()
    /**
     * 相机滤镜创建
     */
    external fun magicFilterCreate(surface:Surface,manager: AssetManager):Int
    external fun magicFilterChange(width:Int,height:Int)
    external fun magicFilterDraw(matrix:FloatArray,isTakePhoto:String)
    external fun magicFilterRelease()
    /**
     * 获取滤镜列表
     */
    external fun getFilterTypes():IntArray
    /**
     * 设置滤镜类型
     */
    external fun setFilterType(type:Int)
    /**
     * 摄像头保存图片
     */
    external fun savePhoto(address:String):Boolean
}

C++部分代码

三、MagicCamera3#OpenGL滤镜_第2张图片
cpp.png

magicjni.cpp

magicjni.cpp和OpenGLJniLib.kt有一一对应的关系,是OpenGLJniLib中声明的函数的具体实现。

Camera

Camera是有关摄像头的底层驱动和渲染方案。

EGL

依赖于libEGL.so
作为Khronos组织为开发内容所提供的API家族的一员,平台无关的API-EGL可以用于管理绘图表面。EGL提供以下机制:
1、与设备的原生窗口系统通信
2、查询绘图表面的可用类型和配置
3、创建绘图表面
4、在OpenGL ES 3.0和其他图形渲染API之间同步渲染
5、管理纹理贴图等渲染资源
EGL提供了OpenGL ES 3.0和运行机器上的原生窗口系统之间的结合,两者之间有通信渠道。

Filter

依赖于libGLESv3.so
内部通过OpenGL语言实现各类型滤镜。

utils

一个工具包类,主要实现更种数学运算。

通过JNI调用了C++的代码

CameraFilterSurfaceCallbackV2中这一行代码将这个SurfaceView和这个应用的assets(内部主要包含glsl语言)传递给C++底层操作了。

OpenGLJniLib.magicFilterCreate(surface,BaseApplication.context.assets)

这里通过JNI调用了C++的代码

CameraFilter *glCameraFilter = nullptr;
AAssetManager *aAssetManager = nullptr;

//相机滤镜surfaceView初始化的时候创建
JNIEXPORT jint JNICALL
Java_com_cangwang_magic_util_OpenGLJniLib_magicFilterCreate(JNIEnv *env, jobject obj,
                                                        jobject surface,jobject assetManager) {
    std::unique_lock lock(gMutex);
    if(glCameraFilter){ //停止摄像头采集并销毁
        glCameraFilter->stop();
        delete glCameraFilter;
    }

    //初始化native window
    ANativeWindow *window = ANativeWindow_fromSurface(env,surface);
    //初始化app内获取数据管理
    aAssetManager= AAssetManager_fromJava(env,assetManager);
    //初始化相机采集
    glCameraFilter = new CameraFilter(window,aAssetManager);
    //创建
    return glCameraFilter->create();
}

你可能感兴趣的:(三、MagicCamera3#OpenGL滤镜)