当前位置: 首页 > news >正文

开封公司网站如何制作网络平台营销

开封公司网站如何制作,网络平台营销,为企业做贡献的句子,广告优化师培训Android SDK 提供了一套 OpenGL ES 接口,该接口是基于 Java 的,速度非常 慢,往往很难满足需要。写此文章的目的是为了使用Android 提供的NDK 工具来使用C/C 原生代码。因最近在研究Android OpenGL ES 部分,就以使用C 来书写opengl…
  Android SDK 提供了一套 OpenGL ES 接口,该接口是基于 Java 的,速度非常 慢,往往很难满足需要。写此文章的目的是为了使用Android 提供的NDK 工具来使用C/C++ 原生代码。因最近在研究Android OpenGL ES 部分,就以使用C++ 来书写opengles 代码, 然后通过JNI 提供给java调用。重要的是避免了调用Android SDK OpenGL ES 接口,是速度大大提高 。

   首先告知大家我使用的平台:(本文将省略如何安装Eclipse ,ADT,及如何配置Android sdk等..)
   Linux Fedora 12 ,Eclipse Helios版本,Android SDK 2.2,Android NDK r4(目前最新)

  安装NDK: 首先去官网下载Android NDK ,在此给提供一个免翻墙的网站:         http://androidappdocs.appspot.com/sdk/ndk/index.html ,并将其加压到任意目录(后文以#NDK 来代表解压目录)

本文不会大多关注代码部分的讲解,我会将主要代码贴出,并在此文的提供给大家源码下载.文中有关于android.mk 代码的编写,可自行参考#NDK/doc/ANDROID-MK.TXT 文档。
1,在Eclipse 下新建Android 项目 (名字:OpenGl_Jni  包:com.opengl.jni) 新建以下四个类
Activity 类 :

package com.opengl.jni;
import android.app.Activity;
import android.os.Bundle;
public class GLActivity extends Activity {
/** Called when the activity is first created. */
private GLCanvas mCanvas;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCanvas = new GLCanvas(getApplication());
setContentView(mCanvas);
}
...........................
}

GlCanvas 类继承GLSurfaceView类:

package com.opengl.jni;
public class GLCanvas extends GLSurfaceView {

private static final String TAG = "GLCanvas";
private static final boolean DEBUG = false;

public GLCanvas(Context context) {
super(context);
// TODO Auto-generated constructor stub
init(false, 0, 0);
}

public GLCanvas(Context context, boolean translucent, int depth, int stencil) {
super(context);
init(translucent, depth, stencil);
}
................
}

GLRenderer 类实现GLSurfaceView.Renderer 接口 :如下

public class GLRenderer implements GLSurfaceView.Renderer{

public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
GLJniLib.step();
}

public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
GLJniLib.init(width, height);
}

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
}

}

GLJniLib 类 :

package com.opengl.jni;

public class GLJniLib {

static {
System.loadLibrary("gljni");
}

/**
* @param width the current view width
* @param height the current view height
*/
public static native void init(int width, int height);
public static native void step();
public static native void setBackColor(float r,float g,float b);
}

2,在OpenGl_Jni项目根目录下 新建jni 文件夹 ,并在jni 文件夹下 建立Android.mk 及gl_code.cpp 文件 ,如下:
Anddroid.mk  内容如下 :
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := libgljni
LOCAL_CFLAGS    := -Werror
LOCAL_SRC_FILES := gl_code.cpp
LOCAL_LDLIBS    := -llog -lGLESv2

include $(BUILD_SHARED_LIBRARY)

gl_code.cpp  内容如下 :

// OpenGL ES 2.0 code

#include <jni.h>
#include <android/log.h>

#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define  LOG_TAG    "libgl2jni"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

static void printGLString(const char *name, GLenum s) {
const char *v = (const char *) glGetString(s);
LOGI("GL %s = %s\n", name, v);
}

static void checkGlError(const char* op) {
for (GLint error = glGetError(); error; error = glGetError()) {
LOGI("after %s() glError (0x%x)\n", op, error);
}
}

static const char gVertexShader[] = "attribute vec4 vPosition;\n"
"void main() {\n"
"  gl_Position = vPosition;\n"
"}\n";

static const char gFragmentShader[] = "precision mediump float;\n"
"void main() {\n"
"  gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n"
"}\n";

GLuint loadShader(GLenum shaderType, const char* pSource) {
GLuint shader = glCreateShader(shaderType);
if (shader) {
glShaderSource(shader, 1, &pSource, NULL);
glCompileShader(shader);
GLint compiled = 0;
glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
if (!compiled) {
GLint infoLen = 0;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen) {
char* buf = (char*) malloc(infoLen);
if (buf) {
glGetShaderInfoLog(shader, infoLen, NULL, buf);
LOGE("Could not compile shader %d:\n%s\n",
shaderType, buf);
free(buf);
}
glDeleteShader(shader);
shader = 0;
}
}
}
return shader;
}

GLuint createProgram(const char* pVertexSource, const char* pFragmentSource) {
GLuint vertexShader = loadShader(GL_VERTEX_SHADER, pVertexSource);
if (!vertexShader) {
return 0;
}

GLuint pixelShader = loadShader(GL_FRAGMENT_SHADER, pFragmentSource);
if (!pixelShader) {
return 0;
}

GLuint program = glCreateProgram();
if (program) {
glAttachShader(program, vertexShader);
checkGlError("glAttachShader");
glAttachShader(program, pixelShader);
checkGlError("glAttachShader");
glLinkProgram(program);
GLint linkStatus = GL_FALSE;
glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
if (linkStatus != GL_TRUE) {
GLint bufLength = 0;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);
if (bufLength) {
char* buf = (char*) malloc(bufLength);
if (buf) {
glGetProgramInfoLog(program, bufLength, NULL, buf);
LOGE("Could not link program:\n%s\n", buf);
free(buf);
}
}
glDeleteProgram(program);
program = 0;
}
}
return program;
}

GLuint gProgram;
GLuint gvPositionHandle;

bool setupGraphics(int w, int h) {
printGLString("Version", GL_VERSION);
printGLString("Vendor", GL_VENDOR);
printGLString("Renderer", GL_RENDERER);
printGLString("Extensions", GL_EXTENSIONS);

LOGI("setupGraphics(%d, %d)", w, h);
gProgram = createProgram(gVertexShader, gFragmentShader);
if (!gProgram) {
LOGE("Could not create program.");
return false;
}
gvPositionHandle = glGetAttribLocation(gProgram, "vPosition");
checkGlError("glGetAttribLocation");
LOGI("glGetAttribLocation(\"vPosition\") = %d\n",
gvPositionHandle);

glViewport(0, 0, w, h);
checkGlError("glViewport");
return true;
}

const GLfloat gTriangleVertices[] = { 0.0f, 0.5f, -0.5f, -0.5f, 0.5f, -0.5f };
GLfloat vVertices[] = {0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f};

// by gaoxi.xie
float _red = 0.9f;
float _green = 0.2f;
float _blue = 0.2f;

void setBackColor(float r, float g, float b) {
_red = r;
_green = g;
_blue = b;
}

void renderFrame() {

static float grey;
grey += 0.01f;
if (grey > 1.0f) {
grey = 0.0f;
}
glClearColor(grey, grey, grey, 1.0f);
checkGlError("glClearColor");
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
checkGlError("glClear");

glUseProgram(gProgram);
checkGlError("glUseProgram");

glVertexAttribPointer(gvPositionHandle, 2, GL_FLOAT, GL_FALSE, 0,
gTriangleVertices);
checkGlError("glVertexAttribPointer");
glEnableVertexAttribArray(gvPositionHandle);
checkGlError("glEnableVertexAttribArray");
glDrawArrays(GL_TRIANGLES, 0, 3);
checkGlError("glDrawArrays");

}

extern "C" {
JNIEXPORT void JNICALL Java_com_opengl_jni_GLJniLib_init(JNIEnv * env, jobject obj, jint width, jint height);
JNIEXPORT void JNICALL Java_com_opengl_jni_GLJniLib_step(JNIEnv * env, jobject obj);
JNIEXPORT void JNICALL Java_com_opengl_jni_GLJniLib_setBackColor(JNIEnv *env ,jobject obj,jfloat r,jfloat g,jfloat b);
};

JNIEXPORT void JNICALL Java_com_opengl_jni_GLJniLib_init(JNIEnv * env, jobject obj, jint width, jint height)
{
setupGraphics(width, height);
}

JNIEXPORT void JNICALL Java_com_opengl_jni_GLJniLib_step(JNIEnv * env, jobject obj)
{
renderFrame();
}
JNIEXPORT void JNICALL Java_com_opengl_jni_GLJniLib_setBackColor(JNIEnv *env ,jobject obj,jfloat r,jfloat g,jfloat b) {
setBackColor(r,g,b);
}

3,通过Android NDK 编译jni 文件下的android.mk gl_code.cpp 生成libgljni.so 文件, 编译方法 :

#NDK$./ndk-build -C ~/dev/workspaceeOpenGl/OpenGl_Jni/jni/ 

如何出现以下
make: Entering directory `/home/gaoxi.xie/dev/workspaceeOpenGl/OpenGl_Jni/jni'
Install        : libgljni.so => /home/gaoxi.xie/dev/workspaceeOpenGl/OpenGl_Jni/libs/armeabi
make: Leaving directory `/home/gaoxi.xie/dev/workspaceeOpenGl/OpenGl_Jni/jni'
证明编译成功 ,生成的libgljni.so 文件会出现ecliose 项目OpenGl_Jni/libs/armeabi 文件下 。如何没有只有refresh OpenGL_Jni 项目即可 ,切记每次编译.so 文件 ,必须刷新项目。

4,运行 OpenGl_Jni 项目即可 ( .so 文件会自动打包到apk 内).


---------------------------------------------------------0ver ------------------------------------------




OpenGl_Jni

OpenGl_Jni.zip(127 KB)


转自http://dev.10086.cn/blog/?uid-103795-action-viewspace-itemid-4733

http://www.lbrq.cn/news/2459071.html

相关文章:

  • 百度免费网站怎样建设太原全网推广
  • 乐清英文网站建设重庆今日头条新闻消息
  • 无锡网站建设 微信微信公众号小程序怎么做
  • 帝国做网站怎么加视频互联网销售是做什么的
  • 临沂网站建设技术支持百度广告位
  • 做网站入什么会计科目爱站工具包的主要功能
  • 微信推广网站建设seo是什么技术
  • 做网站租空间seo一键优化
  • typecho to wordpress网络推广优化seo
  • 佛山专业做网站公司哪家好国内最新新闻
  • 专业做家政网站百度网站首页入口
  • 做互联网营销一般上什么网站seo成创网络
  • 广西网站百度首页排名怎么做到
  • 怎样做 网站的快捷链接网络广告营销典型案例
  • 日照市做网站百度游戏
  • 做网站要懂什么编程怎么推广app
  • 如何查询网站打开速度培训机构招生方案范文
  • 网站建设属于哪个分类编码网站创建的流程是什么
  • 长沙做网站最好的公司有哪些适合发朋友圈的营销广告
  • 无锡定制网站建设网站seo快速优化技巧
  • 怎么套模板 网站模板广东宣布即时优化调整
  • 网站建设属于什么部门网站推广培训
  • 华企立方网站合肥网站排名
  • seo网站推广排名seo网络培训
  • 新网站收录多少关键词搜索关键词软件
  • 个人网站开发报告windows优化大师自动安装
  • 衡水专业网站建设公司seo网站快速排名软件
  • 网站资料要提供哪些百度竞价外包
  • 北京有哪些网站建设公司好抖音seo是什么意思
  • 攀枝花移动网站建设优化网站怎么真实点击
  • Django+celery异步:拿来即用,可移植性高
  • Go的管道——channel
  • 基于MySQL实现基础图数据库
  • 2.JVM跨平台原理(字节码机制)
  • 苍穹外卖Day6
  • Kubernetes配置管理