Nanashi-softプログラマ専用AndroidでOpenGL ES 2.0プログラミング


◇AndroidでOpenGL ES 2.0プログラミング -NDKプロジェクトの生成-

動作する実機の条件などを色々と検討していくと,基本は Javaで組んで,そこから C言語を呼び出す方が好ましいようです
ちなみに NDKだと Android 2.0から OpenGL ES 2.0が使えるそうです

・Android NDKプロジェクトの生成
Eclipseを起動して,メニューのファイル→新規→Androidプロジェクト
プロジェクト名を適当に入れる:testndk
ワークスペース内に新規プロジェクトを作成にチェック
ビルド・ターゲットに2.0以降を選択:ここでは Android 2.2にチェックしました
アプリケーション名に適当な名前を入力:testndk
パッケージ名に適当な名前を入力:jp.testndk
アクティビティー名に適当な名前を入力:testndk
Min SDL Versionにターゲットと同じ『APIレベル』を入力:8
完了ボタンをクリック

サンプルをコピーしたプロジェクトが,一緒に見えていますので
そこから,jniフォルダをおもむろにコピーしちゃいます
1から書くのはルールを理解するのがメンドウですから(*'-')

・最小の OpenGL ES 2.0プログラム
srcフォルダの下にある javaファイルに枠を組みます
package jp.testndk;

import android.app.Activity;
import android.os.Bundle;

import android.opengl.*;
import javax.microedition.khronos.egl.*;
import javax.microedition.khronos.opengles.*;

public class testndk extends Activity {
GLSurfaceView glview;

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

glview = new GLSurfaceView(this);
glview.setEGLContextClientVersion(2);
glview.setRenderer(new testRenderer());
setContentView(glview);
}
}

class testRenderer implements GLSurfaceView.Renderer{
static {
System.loadLibrary("hello-jni");
}

public native void NDKonSurfaceCreated();
public native void NDKonSurfaceChanged(int w,int h);
public native void NDKonDrawFrame();

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
NDKonSurfaceCreated();
}

public void onSurfaceChanged(GL10 gl, int w, int h) {
NDKonSurfaceChanged(w, h);
}

public void onDrawFrame(GL10 gl) {
NDKonDrawFrame();
}
}
基本的に,Javaだけで組むのと同じです
そこから,描画処理部分などを C関数呼び出しにします

System.loadLibrary("「cライブラリ名」");
ライブラリ名と言うのは,Linuxの仕様で,cコンパイルしたファイル名の,
lib「ココ」.so
になります
このサンプルソースの場合は,libhello-jni.soファイルを呼び出す事を意味します

public native void 関数名();
その,ライブラリ上にある関数をヘッダー宣言します

以上の宣言を記述することで,『そのクラス内で』C関数を呼び出す準備ができます
『そのクラス内で』というところが,重要なポイントですので,覚えておいてください

jniフォルダの下にコピーした cファイルに,呼び出される関数を記述します
#include <jni.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>

void Java_jp_testndk_testRenderer_NDKonSurfaceCreated(JNIEnv* env)
{
}

void Java_jp_testndk_testRenderer_NDKonSurfaceChanged(JNIEnv* env, jobject obj, jint w, jint h)
{
}

void Java_jp_testndk_testRenderer_NDKonDrawFrame(JNIEnv* env)
{
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
この関数名は,規則があって,こう書かなければなりません
Java_「srcのすぐ下のフォルダ名の.を_に置換した文字列」_「呼び出し元のJavaクラス名」_「Javaから呼び出す関数名」

これをビルドする際には,jniフォルダの下に置いた Android.mkをエディタで開いて(Eclipseから編集しようとするとなんかわからないエラーが出ます),LOCAL_LDLIBSを追記する必要があります
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c

LOCAL_LDLIBS := -lGLESv2

include $(BUILD_SHARED_LIBRARY)
そして,Cygwinコマンドラインからビルドする
$ cd /cygdrive/c/「パス名」
$ ndk-build
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
そうすると,libs/armeabi/libhello-jni.soが生成されます

Eclipseから,メニュー→プロジェクト→すべてビルド(自動的にビルドのチェックを外すと選べるようになる)

binフォルダの下にある testndk.apkが実行ファイルになります
これをサーバーにアップして,実機のブラウザからダウンロードすれば実行できます


TOPプログラマ専用AndroidでOpenGL ES 2.0プログラミング