最近、C++11がお気に入り。
※なんでC++14でないかは、Googleセンセに聞いてください。(Android NDKがまだC++11だから。)

ちょっとびっくりなほど、イケとーけん!!
がばいカッコよか!!
もう、惚れた。

だけん、今までのSurfaceViewでOpenGL描画のソースコードをC++11チックに作成しなおしてみた。
・pthreadを使わずに、std::threadを使う。
・スレッド間通信に、std::queueを使う。
・スレッド間通信に、関数オブジェクトも使う。
・スレッド間通信に、ラムダ式も使う。

Javaの部分
・MainActivity.java

ほとんど、一緒。NativeFunc.draw()を定期実行する様に修正しただけ。

Javaの部分2
・NativeFunc.java

ほとんど、一緒。NativeFunc.draw()を追加しただけ。

c++の部分
・CppSurfaceView.cpp/CppSurfaceView.h
 →Java→C++呼出し…JniIF.cpp
 →スレッド間通信…ActiveObject.cpp
 →EGL系処理…SurfaceView.cpp
 →モデル系処理…GLDraw.cpp
 →行列計算処理…Matrix.cpp
 とに分離してファイル自体は削除。

・JniIF.cpp/JniIF.h
CppSurfaceView/CppSurfaceViewから、Java→C++呼出し関数を切出した。
ここから、ActiveObjectへイベントを送信している。

ActiveObject.cpp/ActiveObject.h
スレッド間の非同期通信を司るクラス。
これで、自分的に、かなり簡潔になった。
以下、工夫したところ。
 ・std::queue>を使うようにした。
  これで、かなり自由度が増した。
  関数の型がint aaa()でも、int aaa(int arg1)でも、int aaa(int arg1, int arg2)でも、いくつでもOK。
  さらに、int aaa(char *aaa)とかもOK。
  ※呼び側でstd::bind()するのが前提。


・SurfaceView.cpp/SurfaceView.h
CppSurfaceViewから、EGL系処理を切出した。
外部公開関数は、4つだけ。
  static int ReqInitCppSurface(int surfaceid, ANativeWindow *pWindow);
  static int ReqPreDrawCppSurface(int surfaceid, int width, int height);
  static int ReqDrawCppSurface(int surfaceid);
  static int ReqDestroyCppSurface(int surfaceid);
SurfaceViewのsurfaceCreated()/surfaceChanged()/surfaceDestroyed()のタイミングで呼び出せば、
適宜,EGL系の設定処理をする様にした。


・GLDraw.cpp/GLDraw.h
CppSurfaceViewから、モデル系処理を切出した。
ここは、何を描画するかによって実装が変化する部分。
だけど、外部公開関数は、4つだけ。
void Init();
void PreDraw(int width, int height);
void Draw();
void Fin();

・Matrix.cpp/Matrix.h
純粋に行列変換処理だけをまとめたクラス。
全部static関数。

あー、楽しかった。
ラムダ式、よかばい。
使わんと!!

ソースコード一式はココ