OpenGLJniLib
OpenGLJniLib是我们通过kotlin使用OpenGL的核心衔接处
kotlin代码中使用到OpenGLJniLib的地方如下图:
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++部分代码
cpp.pngmagicjni.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<std::mutex> 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();
}
网友评论