【OPENGLES】opengles-jni实例1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jaych/article/details/52080912

首先,说明下为什么要用jni实现opengl es

在进行移动端图像算法开发的过程中,需要完成对大量的数据进行处理,opengl是在进行图形渲染或者大批量图像运算处理时有着很大的优势。如果能够在算法库开发中加入opengl,则对于提升算法运行效率有很大帮助。

本系列文章则是描述如何用opengl进行图像算法的开发。
本文主要描述如何完成一个简单的opengles实例,通过jni调用opengles接口。

1、基本框架

最简单的opengles实例可参考:《Opengl ES入门1》
这里完成的实例主要是通过在java层,对opengl es的接口进行调用。

下面,将具体介绍如何转换成jni接口的调用。

2、jni接口定义

在MyGLSurfaceView中,修改三大接口如下:
其实GLSurfaceView中java层的调用跟在jni层调用是一致的,只不过在具体实现的时候是在jni调用opengles库实现而已。

    @Override
    public void onDrawFrame(GL10 arg0) {
        // TODO Auto-generated method stub
        render();
    }
    @Override
    public void onSurfaceChanged(GL10 arg0, int width, int height) {
        // TODO Auto-generated method stub
        surfaceChanged( width, height);
    }
    @Override
    public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {
        // TODO Auto-generated method stub
        surfaceCreated();
    }
    public native void surfaceChanged(int w, int h);
    public native void surfaceCreated();
    public native void render();
    static{
        System.loadLibrary("OpenglTest");
    }

工程项目下新建jni文件夹,然后写makefile文件及src文件
Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
OPENGLES_LIB  := -lGLESv2
OPENGLES_DEF  := -DUSE_OPENGL_ES_2_0
LOCAL_CFLAGS := -Wno-write-strings $(OPENGLES_DEF)
LOCAL_LDLIBS := \
     -llog $(OPENGLES_LIB) 
LOCAL_MODULE    := libOpenglTest
LOCAL_CFLAGS    := -Werror
LOCAL_SRC_FILES := OpenglUtil.cpp
LOCAL_SHARED_LIBRARIES := liblog libGLESv2
include $(BUILD_SHARED_LIBRARY)

OpenglUtil.cpp

#include <stdlib.h>
#include <stdio.h>
#include <android/log.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include "jni.h"

#define EPRINTF(...)  __android_log_print(ANDROID_LOG_ERROR,"OpenglUtil",__VA_ARGS__)
#define DPRINTF(...)  __android_log_print(ANDROID_LOG_DEBUG,"OpenglUtil",__VA_ARGS__)
#ifdef __cplusplus
extern "C"{
#endif
JNIEXPORT void JNICALL Java_com_example_opengltest_MyGLSurfaceView_surfaceCreated
( JNIEnv * env, jobject obj, jint width, jint height)
{
   DPRINTF( "surface create" );
   //Set up viewport. We only need to do this once.
   glClearColor(1.0f, 0, 0, 1.0f);
   return;
}
JNIEXPORT void JNICALL
   Java_com_example_opengltest_MyGLSurfaceView_surfaceChanged
(   JNIEnv * env, jobject obj, jint width, jint height )
{
   DPRINTF( "Viewport changed to %ux%u \n", width, height );
   //Set up viewport. We only need to do this once.
   glViewport(0, 0, width, height);
   return;
}
JNIEXPORT void JNICALL Java_com_example_opengltest_MyGLSurfaceView_render
(  JNIEnv * env, jobject obj, jbyteArray img, jint w, jint h)
{
    glClear(GL_COLOR_BUFFER_BIT);
}
#ifdef __cplusplus
}
#endif

3、在eclipse中编译JNI:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

保存即可。
并把新建的jni_builder位置移动到最上面。
这样设置之后,每次修改完jni文件夹内部文件时都会自动编译。
编译完下载运行即可。

本文实例具体代码可参考:opengles-jni实例

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页