在https://zhuanlan.zhihu.com/p/68782491中已经介绍了如何加载EGL和OpenGL具体软硬件实现,其中system\lib\libEGL.so是加载具体实现的桥梁。下面分析java层的OpenGL相关类是如何和底层库联系起来的?不难猜测,肯定是通过JNI联系起来的。

package android.opengl

java层关于opengl的第一个包为,

package android.opengl;

代码路径在frameworks\base\opengl\java\android\opengl,其中的java文件有,

├── EGL14.java

├── EGLConfig.java

├── EGLContext.java

├── EGLDisplay.java

├── EGLExt.java

├── EGLLogWrapper.java

├── EGLObjectHandle.java

├── EGLSurface.java

├── ETC1.java

├── ETC1Util.java

├── GLDebugHelper.java

├── GLErrorWrapper.java

├── GLES10Ext.java

├── GLES10.java

├── GLES11Ext.java

├── GLES11.java

├── GLES20.java

├── GLES30.java

├── GLException.java

├── GLLogWrapper.java

├── GLSurfaceView.java

├── GLU.java

├── GLUtils.java

├── GLWallpaperService.java

├── GLWrapperBase.java

├── ManagedEGLContext.java

├── Matrix.java

├── package.html

└── Visibility.java

里面包含了EGL、GLES 1.0、1.1、1.1 Ext、2.0、3.0。

javax.microedition.khronos.opengles

java层关于opengl的另外一个包为,

package javax.microedition.khronos.opengles;

代码路径为frameworks\base\opengl\java\javax\microedition\khronos\opengles,其中的java类包括,

├── egl

│?? ├── EGL10.java

│?? ├── EGL11.java

│?? ├── EGLConfig.java

│?? ├── EGLContext.java

│?? ├── EGLDisplay.java

│?? ├── EGL.java

│?? └── EGLSurface.java

└── opengles

├── GL10Ext.java

├── GL10.java

├── GL11ExtensionPack.java

├── GL11Ext.java

├── GL11.java

├── GL.java

└── package.html

其中,包含了EGL 1.0、1.1,GLES 1.0、1.0 Ext、1.1、1.1 Ext。

JNI调用关系

以package android.opengl中的GLSurfaceView.java为例,该类为上层专门为方便使用opengl提供的。EglHelper类是个辅助类,为EGL搭建本地环境等。

/*** An EGL helper class.*/

private static class EglHelper {

/*** Initialize EGL for a given configuration spec.* @param configSpec*/

public void start() {

if (LOG_EGL) {

Log.w("EglHelper", "start() tid=" + Thread.currentThread().getId());

}

//返回com.google.android.gles_jni.EGLImpl, /** Get an EGL instance*/

mEgl = (EGL10) EGLContext.getEGL();

//调用EGLImpl的eglGetDisplay /** Get to the default display.*/

mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);

if (mEglDisplay == EGL10.EGL_NO_DISPLAY) {

throw new RuntimeException("eglGetDisplay failed");

}

}

public abstract class EGLContext

{

private static final EGL EGL_INSTANCE = new com.google.android.gles_jni.EGLImpl();

public static EGL getEGL() {

return EGL_INSTANCE;

}

public abstract GL getGL();

}

}

eglGetDisplay函数最终会去调用native函数_eglGetDisplay,

/* frameworks\base\opengl\java\com\google\android\gles_jni\EGLImpl.java */

public synchronized EGLDisplay eglGetDisplay(Object native_display) {

int value = _eglGetDisplay(native_display);

if (value == 0) {

return EGL10.EGL_NO_DISPLAY;

}

if (mDisplay.mEGLDisplay != value)

mDisplay = new EGLDisplayImpl(value);

return mDisplay;

}

private native int _eglGetDisplay(Object native_display);

根据包名、类名找到JNI实现frameworks\base\core\jni\com_google_android_gles_jni_EGLImpl.cpp,

{"_eglGetDisplay", "(" OBJECT ")I", (void*)jni_eglGetDisplay },

实际调用的是eglGetDisplay函数,

static jint jni_eglGetDisplay(JNIEnv *_env, jobject _this, jobject native_display) {

return (jint)eglGetDisplay(EGL_DEFAULT_DISPLAY);

}

那么这个eglGetDisplay是在哪实现的?怎么找?当然是从头文件和makefile中。

在frameworks\base\core\jni\com_google_android_gles_jni_EGLImpl.cpp中,

#include #include #include

而在com_google_android_gles_jni_EGLImpl.cpp所在的makefile中,

//会去加载system\lib\libEGL.so库,桥梁加载了

LOCAL_SHARED_LIBRARIES := \ libui \ libgui \ libinput \ libcamera_client \ libcamera_metadata \ libskia \ libsqlite \ libEGL \ libGLESv1_CM \ libGLESv2 \ libETC1 \

LOCAL_C_INCLUDES += \ $(JNI_H_INCLUDE) \ $(LOCAL_PATH)/android/graphics \ $(LOCAL_PATH)/../../libs/hwui \ $(LOCAL_PATH)/../../../native/opengl/libs \ $(call include-path-for, bluedroid) \ $(call include-path-for, libhardware)/hardware \ $(call include-path-for, libhardware_legacy)/hardware_legacy \ $(TOP)/frameworks/av/include \ $(TOP)/system/media/camera/include \ external/skia/src/core \ external/skia/src/pdf \ external/skia/src/images \ external/skia/include/utils \ external/sqlite/dist \ external/sqlite/android \ external/expat/lib \ external/openssl/include \ external/tremor/Tremor \ external/icu4c/i18n \ external/icu4c/common \ external/jpeg \ external/harfbuzz_ng/src \ external/zlib \ frameworks/opt/emoji \ libcore/include

ifeq ($(USE_OPENGL_RENDERER),true)

LOCAL_SHARED_LIBRARIES += libhwui

endif

//这里的这些jni文件很重要,生成libandroid_runtime库

LOCAL_MODULE:= libandroid_runtime

include $(BUILD_SHARED_LIBRARY)

从上面的makefile中我们能看到,会去加载库system\lib\libEGL.so,也就是加载EGL和OpenGL实现的桥梁,这样就将java层的EGL、OpenGL同底层实现的库联系起来。

opengl java_android graphic(20)—java层OpenGL相关类相关推荐

  1. 理解Android Binder机制(3/3):Java层

    本文是Android Binder机制解析的第三篇,也是最后一篇文章.本文会讲解Binder Framework Java部分的逻辑. Binder机制分析的前面两篇文章,请移步这里: 理解Andro ...

  2. Binder Java层实现(一):IBinder/IInterface/Binder/Stub

    要点 面向对象思想的引入将进程间通信转化为通过对某个Binder对象的引用调用该对象的方法,而其独特之处在于Binder对象是一个可以跨进程引用的对象,它的实体(本地对象)位于一个进程中,而它的引用( ...

  3. Android系统中的Binder通信机制分析(7)- Java 层的 Binder 机制

    声明 其实对于Android系统Binder通信的机制早就有分析的想法,记得2019年6.7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾- 文中参考 ...

  4. Android—Java层与Native层对象的关联

    JNI 函数注册 静态注册: 1.java层的native方法, 如:public native void close(); 2.头文件:JNIEXPORT void JNICALL Java_and ...

  5. JOGL - Java与OpenGl的绑定(转)

    JOGL - Java与OpenGl的绑定 默认分类 2009-11-22 20:31:05 阅读4 评论0 字号:大中小 在这篇文章里,摘录了<学习Java对于OpenGl的绑定>.作者 ...

  6. java对opengl绑定_你好,JOGL - Java与OpenGl的绑定-Java频道-中国IT实验室

    然后出现了JOGL 也许是最流行的真正的面向对象的编程语言.有许多用去结合OpenGL的尝试,但是第一个被大家认可并注意的是Java对于OpenGl的绑定(Java Bindings for Open ...

  7. java的OpenGL学习资料

    java+eclipse+opengl环境配置 使用Eclipse RCP进行桌面程序开发(六):向OpenGL进军 xxyy888的计算机图形学博客 wjyjimy的jogl的入门 java Ope ...

  8. JOGL   java调用openGL

    JOGL   java调用openGL JOGL   java调用openGL JOGL   java调用openGL JOGL   java调用openGL http://download.java ...

  9. JAVA的OPENGL,JOGL入门实例----不断变色的点阵 (源代码)

    原文:http://blog.csdn.net/sidihuo/article/details/44035015 第一个类(代码解读) [java] view plaincopy package te ...

最新文章

  1. 目前的计算机聪原理上讲,计算机组成原理-第23-24讲(第7章)+课件.ppt
  2. 在 64 位版本的 Windows 上,如何在 32 位版本的 ASP.NET 1.1 和 64 位版本的 ASP.NET 2.0 之间切换...
  3. 那些年,面试被虐过的红黑树 1
  4. AP(无线访问接入点(WirelessAccessPoint))
  5. python中random函数用法_random函数的用法
  6. 【Day01】你有封装过 axios 吗?主要是封装哪些方面?如何中断 axios 请求?
  7. ajax后台如何把对象转为json_SM后台数据与前端(PC、M站、Android、IOS)的交互——页面渲染...
  8. vue 表格中有列需要异步加载_vue.js表格分页,ajax异步加载数据
  9. 系统类配置(五)【ubuntu14.04下安装cuda8+nvidia-410.78+cudnn6.0 +tensorflow-gpu==1.4.0。】
  10. Android --自定义简单Toast
  11. 暴力破解-----token验证
  12. java现代编译原理pdf脚本之家_详解编译器编译原理
  13. USB转NRF24L01模块 带UI上位机
  14. matlab状态反馈控制器设计,状态反馈控制器设计方案书.doc
  15. 计算机网络与通讯教案,计算机网络技术教案.docx
  16. IK分词器结合ES使用
  17. 携职教育:正式公布!中级会计成绩,你查了吗?
  18. 如何备份整个硬盘为镜像文件?
  19. 第一次计算机比赛心得
  20. Win10改用microsoft账户登录发生了错误怎么解决?

热门文章

  1. linux IP 设置
  2. Editplus 3.0 开发ext 教程
  3. redis中zset底层实现原理
  4. 一个打印有规律图形的c程序。
  5. python 项目结构图_python+selenium-【六】-完整的项目结构
  6. golang结构体tag的使用
  7. 并发编程的数据竞争问题以及解决之道
  8. Laravel核心解读--观察者模式
  9. matlab gui表格行标1234没有,MATLAB GUI:滑塊作爲滾動條;子面板不夾
  10. 浅谈分布式一致性协议之2PC