您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
3. 使用NDKC++完成EGL、display、surface、contex配置和初始化~1
发布时间:2021-06-05 20:51:12编辑:雪饮阅读()
繼上次shader项目配置和创建完成了java部分的代码之後。接下來我們來完成cpp部分的代碼。
来创建一个可实际显示的Surface。
可以用eglCreateContext (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list)創建。
EGL变量之间的绑定
boolean eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context)
该接口将申请到的display,draw(surface)和 context进行了绑定。也就是说,在context下的OpenGLAPI指令将draw(surface)作为其渲染最终目的地。而display作为draw(surface)的前端显示。调用后,当前线程使用的EGLContex为context。
以上就是具體的步驟,那麽接下來咱們就來具體的實現吧。cpp/native-lib.cpp:
#include <jni.h>
#include <string>
#include <android/log.h>
#include <android/native_window_jni.h>
#include <EGL/egl.h>
#define LOGD(...) __android_log_print(ANDROID_LOG_WARN,"testff",__VA_ARGS__)
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_yuv_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}extern "C"
JNIEXPORT void JNICALL
Java_com_example_yuv_XPlay_Open(JNIEnv *env, jobject thiz, jstring url_, jobject surface) {
const char *url=env->GetStringUTFChars(url_,0);
LOGD("open url is %s",url);
//獲取原始窗口
ANativeWindow *nwin=ANativeWindow_fromSurface(env,surface);
//1 display創建和初始化
EGLDisplay display=eglGetDisplay(EGL_DEFAULT_DISPLAY);
if(display==EGL_NO_DISPLAY){
LOGD("eglGetDisplay failed!");
return;
}
if(EGL_TRUE!=eglInitialize(display,0,0)){
LOGD("eglInitialize failed");
return;
}
//2 surface
//2-1 surface窗口配置
//輸出配置
EGLConfig config;
EGLint configNum;
//c語言數組結束填充,這裏用EGL_NONE
EGLint configSpec[]={
EGL_RED_SIZE,8,
EGL_GREEN_SIZE,8,
EGL_BLUE_SIZE,8,
EGL_SURFACE_TYPE,EGL_WINDOW_BIT,
EGL_NONE
};
//EGL_TRUE的宏定義值為1
if(EGL_TRUE!=eglChooseConfig(display,configSpec,&config,1,&configNum)){
LOGD("eglChooseConfig failed!");
return;
}
//創建surface
EGLSurface winsur> if(winsur>EGL_NO_SURFACE){
LOGD("eglCreateWindowSurface failed!");
return;
}
//3 context創建關聯的上下文
const EGLint ctxAttr[]={
EGL_CONTEXT_CLIENT_VERSION,2,EGL_NONE
};
//第三個參數是在多個上下文進行共享的時候用的,這裏用不到,所以就是設置為EGL_NO_CONTEXT,最後一個參數是接收一個版本信息
EGLContext context=eglCreateContext(display,config,EGL_NO_CONTEXT,ctxAttr);
if(context==EGL_NO_CONTEXT){
LOGD("eglCreateContext failed!");
}
//上下文關聯起來就可以進行數據的交換,第二和第三個函數是分別用來繪製、讀取的
if(EGL_TRUE!=eglMakeCurrent(display,winsurface,winsurface,context)){
LOGD("eglMakeCurrent failed!");
return;
}
LOGD("EGL Init Success");
env->ReleaseStringUTFChars(url_,url);
}然後編譯運行,其實這次運行也是沒有明顯效果
只要能成功顯示上面我們目標應該顯示的内容”EGL Init Success”這樣就算是成功了。
关键字词:surface,EGL