OpengGL ES2.0 With NDK

使用C语言在Android Studio中编写OpenGL ES,首要的任务就是配置编程环境。

在最新的Android Studio中,可以直接编译C/C++源代码。本人的版本是Android Studio2.0。

1.程序结构图

2.在local.properties中添加并确认ndk路径

ndk.dir=C\:\\Users\\Liroc\\AppData\\Local\\Android\\Sdk\\ndk-bundle
sdk.dir=C\:\\Users\\Liroc\\AppData\\Local\\Android\\Sdk

3.在gradle.properties中添加NDK支持

org.gradle.jvmargs=-Xmx4g -XX\:MaxPermSize\=512m
android.useDeprecatedNdk=true

4.在build.gradle(app)中添加ndk模块,同时需要增加子节点ldLibs,使程序在编译时,可以链接到libGLESv2.so

android {
    compileSdkVersion 23
    buildToolsVersion "24.0.1"

    defaultConfig {
        applicationId "com.example.liroc.openglone"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

        ndk {
            moduleName "game"
            ldLibs "GLESv2"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
        }
    }
}

5.添加native code

#include <GLES2/gl2.h>

void on_surface_created() {
    glClearColor(1.0f, 1.0f, 0.0f, 0.0f);
}

void on_surface_changed() {

}

void on_draw_frame() {
    glClear(GL_COLOR_BUFFER_BIT);
}

6.添加相应的类来调用JNI代码

public class BasicNativeLib {
    static {
        System.loadLibrary("game");
    }

    public static native void on_surface_created();

    public static native void on_surface_changed(int width, int height);

    public static native void on_draw_frame();
}

7.相应的JNI函数

#include <jni.h>

JNIEXPORT void JNICALL Java_com_example_liroc_openglone_testone_BasicNativeLib_on_1surface_1created
    (JNIEnv * env, jclass cls) {
    on_surface_created();
}

JNIEXPORT void JNICALL Java_com_example_liroc_openglone_testone_BasicNativeLib_on_1surface_1changed
    (JNIEnv * env, jclass cls, jint width, jint height) {
    on_surface_changed();
}

JNIEXPORT void JNICALL Java_com_example_liroc_openglone_testone_BasicNativeLib_on_1draw_1frame
    (JNIEnv * env, jclass cls) {
    on_draw_frame();
}

8.最后,在我们的GLSurface.Renderer类中调用相应的方法即可

   private class SceneRenderer implements GLSurfaceView.Renderer {
        BasicTriangle triangle;

        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            //glClearColor(0, 0, 0, 1.0f);
            //triangle = new BasicTriangle(BasicGLSurfaceView.this);
            BasicNativeLib.on_surface_created();
        }

        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            //glViewport(0, 0, width, height);
            BasicNativeLib.on_surface_changed(width, height);
        }

        @Override
        public void onDrawFrame(GL10 gl) {
            //glClear(GL_COLOR_BUFFER_BIT);
            //triangle.draw();
            BasicNativeLib.on_draw_frame();
        }
    }

9.效果图

时间: 2024-11-08 21:30:10

OpengGL ES2.0 With NDK的相关文章

Android +NDK+eclipse+opengl ES2.0 开启深度测试

参考:https://www.opengl.org/discussion_boards/showthread.php/172736-OpenGL-ES-Depth-Buffer-Problem 环境:eclipse,ndkr8,opengl es2.0,android 最近使用eclipse和NDK进行android opengl es2.0的开发,发现了绘制的物体显示与深度无关,而与绘制的前后顺序有关.想了一下,应该是深度测试没有开启,开启了glEnable(GL_DEPTH_TEST),但是

OpenGL ES2.0 基本编程

1. EGL OpenGL ES命令需要一个rendering context和一个drawing surface. Rendering Context: 保存当前的OpenGL ES状态. Drawing Surface: 是原语(primitive)画图的Surface.它指定了渲染的buffer类型,如:color buffer,depth buffer和stencil buffer:同时它也指定了每个需要的buffer的位深度(bit depth). EGL是OpenGL ES API与

iOS开发——图形编程OC篇&amp;OpenGL ES2.0编程步骤

OpenGL ES2.0编程步骤 OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设计.该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准. 1. 保存全局变量的数据结构 以下例子程序均基于Linux平台. 1 typedef struct _escontext 2 { 3 void* userData; // P

OpenGL ES2.0 入门经典例子

原文链接地址:http://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial 免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! ps:非常感谢skingTree为我们提供的这篇翻译教程,感谢yy.小狼.北方加入我的教程翻译团队,谢谢你们! 教程截图: OpenGL ES 是

Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤

原文地址: Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤 - 网络资源是无限的 - 博客频道 - CSDN.NET http://blog.csdn.net/fengbingchun/article/details/11192189   1.  先按照http://blog.csdn.net/fengbingchun/article/details/10439281中操作搭建好基本的Android开发环境: 2.  打开Eclipse,-->Window-->

Android用OpenGL ES2.0显示YUV数据,在手机上需要两种坐标系的解决方案

如题 ,不知道大家看懂了这个题目没有,给个链接:http://blog.csdn.net/wangchenggggdn/article/details/8896453(下称链接①), 里面评论有很多人提到了这个问题,我也是其中一员,但是问遍了所有人,自己也发帖(http://bbs.csdn.net/topics/390769358) 寻求解决方案,却终究没能得到一个可用的方案. 从2014年4月中旬遇到这个问题,纠结了两个多星期,终于在看了好多好多资料之后,于4月的最后一个周一,暂时解决了这么

iOS OpenGL ES2.0 开发实例

本教程源码地址下载:https://github.com/wanglixin1999/HelloGL OpenGL ES 是可以在iphone上实现2D和3D图形编程的低级API. 如果你之前接触过 cocos2d,sparrow,corona,unity 这些框架,你会发现其实它们都是基于OpenGL上创建的. 多数程序员选择使用这些框架,而不是直接调用OpenGL,因为OpenGL实在是太难用了. 而这篇教程,就是为了让大家更好地入门而写的. 在这个系列的文章中,你可以通过一些实用又容易上手

AndroidStudio2.0搭建Ndk环境&amp;成功编译使用

现在使用Ndk开发的场景还蛮多,游戏引擎.音视频开发等都能涉及到,以前的工程大部分都是Eclipse的工程目录,但是App开发现在大部分都是在AndroidStudio开发工具中进行的,那就有个问题了?怎么在As中搭建Ndk的环境呢.这就是本篇文章所要解答的,并且会创建一个小例子,编译成.so文件,且在项目中使用.Come on-. 在没具体动手之前我们想一想怎么实现比较好吧,假如我们新建一个As2.0的工程,然后按照他的目录结构把jni层文件放到指定的目录下,然后进行开发,固然可行,可行是可行

android studio 1.0 开发 ndk 调用 c++ so库

一个没用过java和安卓的人使用android studio开发带c++ so库的安卓程序用例(以ndk的hello-jni为例),对于不熟悉java和安卓的人来说这个很花时间,希望通过这篇文章帮助跟我一样的人,欢迎随便转载: 1.下载安装android sdk和ndk,ndk r10(目前最新)是单独可以编译c++的,无需cygwin. 2.安装android studio. 3.通过ndk-build命令编译sample中的hello-jni,生成so库. 4.在android studio