PlaygroundOSSとの戦い(1)

依然前のブログに書いたが、シリーズ化しそうなので移行した。


この記事は
Klabさんの素晴らしいゲームエンジンPlaygroundOSSが個人的に難しいと話題になったので動かそうとがんばった記録である。

この記事通りにやっても動きません。

0.研究環境&対象OS

Mac OS X 10.9.5
Android Studio 1.0 RC1
Android NDK 10d
=============
Nexus5
Android 5.0 Lollipop

ADTは今年のI/O的に積極的にさけた方が良いと思っているので
早くAndroidStudio対応Docくだしあ><

1.いろいろインストール

Android NDK より Mac OS X 64-bit android-ndk-r10d-darwin-x86_64.bin
developer.android.com よりAndroid Studio (tools.android.comで最新版は手に入る)
Path を通す

export ANDROID_NDK_ROOT="/{落とした場所}/android-ndk-r10d"
PATH=$PATH:$ANDROID_NDK_ROOT

上の2行を.profileというファイル名で~/の中にかいておく。
公式DocではSDKのインストールをしていたがAndroidStudioを使うのでいりません。
とりあえず

$ndk-build

と入力して「Android NDK: Could not find application project directory !」的な結果が帰ってきたら大丈夫です。

2.cloneする

とりあえずgitは入れておこう

$git clone https://github.com/KLab/PlaygroundOSS.git

3.Buildする

Playgroundの中に入る

$cd /{落とした場所}/PlaygroundOSS/Engine/porting/Android/GameEngine-android

permissionの設定

$chmod +x ./build.py

build実行

$./build.py --rebuild --project SampleProject

(イミワカンナイ感あるがSampleProjectでないと怒られる。イミワカンナイ)

4.AndroidStudioで開く

AndroidStudio 起動

  • > Import Project -> /{落とした場所}/PlaygroundOSS/Engine/porting/Android/GameEngine-androidを選択

当然いい感じに開ける。
とりあえず、もろもろ準備
local.propertiesにsdkの場所が書いてあるはずなのでその下にndkの場所も追加する。

ndk.dir=/{落とした場所}/android-ndk-r10dandroid-ndk-r10d

Gradeを走らせる。こける。

箇所1

  修正前のコード

dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
}

  修正後のコード

dependencies {
  classpath 'com.android.tools.build:gradle:0.14.4'
}

箇所2

修正前のコード

compileSdkVersion 17
buildToolsVersion "18.1.0"

修正後のコード

compileSdkVersion 21
buildToolsVersion "21.0.2"

箇所3

修正前のコード

tasks.withType(com.android.build.gradle.tasks.PackageApplication) {
  pkgTask -> pkgTask.jniDir new File(projectDir, 'libs')
}

修正後のコード

tasks.withType(com.android.build.gradle.tasks.PackageApplication) {
  pkgTask ->
    pkgTask.jniFolders = new HashSet<File>()
    pkgTask.jniFolders.add new File(projectDir, 'libs')
}

多分jniDirがないだかで怒られるはず。
で、上の修正した後gradeを走らせると落ちる。落ちた。

今回ごり押しでやったので落ち着いたら別の方法を載せる予定

なので落ちた部分をコメントアウトしてgradeはしらせて成功したあとコメントアウトを外してもう一回gradeを走らせた。
コメントアウトした箇所は

    if(new File(projectDir, "jni").exists()){
        tasks.withType(Compiler) {
            compileTask -> compileTask.dependsOn ndkBuild
        }
        tasks.withType(com.android.build.gradle.tasks.PackageApplication) {
            pkgTask ->
                pkgTask.jniFolders = new HashSet<File>()
                pkgTask.jniFolders.add new File(projectDir, 'libs')
        }
        clean.dependsOn 'ndkClean'
        clean.dependsOn 'libsClean'
    }

である。 多分Buildはできたはず。

5.Assetsの追加

$cd /PlaygroundOSS/Tutorial/01.SimpleItem/.publish/android/
$zip -r -0 /PlaygroundOSS/Engine/porting/Android/GameEngine-android/assets/AppAssets.zip ./*
$echo -n "1" > /Playground0SS/Engine/porting/Android/GameEngine-android/assets/version ./*

公式のDocのまま。echoの数字はバージョン番号で、変更が合ったら数字をかえよう。
できた、AppAssets.zipとversionをAndroidStudio上でassetsというディレクトリを作って放り込む。階層はGameEngine-android直下にした。
(version の中身はAppAssets.zipのMD5の方が良いとの知見を得た)

6.コードの修正

やはりか、という感じでエラーが起きる。イミワカンナイ!ダレカタスケテー!

Process: klb.android.GameEngine, PID: 31119  java.lang.RuntimeException: createContext failed: EGL_BAD_MATCH
  at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1192)
  at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1183)
  at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1033)
  at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1400)
  at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1239) 

で。このエラーを解決するのに時間を無駄にしたのだが結論は
klb.android.GameEngine.GameGLSurfaceView内の54行目あたりにある

PFInterface pfif = PFInterface.getInstance();int glver = pfif.getGLVersion();setEGLContextClientVersion(glver);

で、glverが-1を返していた。
setEGLContextClientVersion(2);のコメントアウトを外したら動いた。

画面が黒い。Assetが表示されない<-今ココ

という訳でダレカタスケテー!

JPHack参加時に使用した環境等

2015年からははてなブログに移行よてい。
旧ブログ
mizukindevelop


こんにちは。

先日、JPHackと言うHackathon

JPHACKS | The biggest hackathon of Japan
に参加してきた。さすが東京大学、広い!つらい!疲れる!

JPHackと言うHackathon東京大学主催だけあって参加チームが強く、技術的に
どれも凄かった。

今回の自分たちのプロダクト

握手をしただけで名刺交換できるガジェット

使った端末・環境

  • Edison


Intel Edison Breakout Board Kit - スイッチサイエンス
先日のTechCrunch Hackathonで存在を知り、MakerFaireで買ってしまった物。

いつもの。Lollipop。Nexus5。
Nexus 5(16 GB、ブラック) - Google Playの端末
去年発売と同時に衝動買いしたもの。最高のAndroid端末だと思う。


クラウド コンピューティング なら アマゾン ウェブ サービス | 仮想サーバー、ストレージ、データベースのための Amazon が提供するクラウドサービス (AWS 日本語)
サーバー側の実装は全部これ。主にEC2,DynamoDB,S3あたりを使っている。2月に1年たつので課金の準備中

使った言語・ライブラリ

  • Node.js


sandeepmistry/node-bleacon · GitHub
前にiBeacon周りの実装で使った記憶があるのでこれでやった。


Edisonのコア部分はほぼ全部Pythonで書いた。subprocess。GPIO。
ここら辺の実装はShellScriptに移行したい。


Welcome | Flask (A Python Microframework)
Flaskで簡単なRest API的な物を実装した。
DynamoDBへの接続は
AWS SDK for Python | アマゾン ウェブ サービス(AWS 日本語)
を使った。


Javaではないが非常によく似た言語。Androidのアプリケーションを作成するときに利用する。
適当にAsyncTaskLoaderとSocket通信周りを実装。

研究し、実装をがんばろうとしたもの

人体通信
IEEE 802.15.6
http://arxiv.org/pdf/1102.4106.pdf
人体を伝ってデータ通信を行う技術。
今回のHackathonはこれのモジュール作成に費やした。
深夜のハンダ付けは手が震えるのでオススメしない。
眠眠打破×ハンダ付けは絶対にやらないほうがいい。



今回は初めてハードを使ったHackathonだったのでハンダ付けつらかった。
実装は動けば良いと思っていたのでかなり雑なので黒い歴史となった。
今後人体通信が医療分野では必要となっていくので研究開発をしていきたい。

蛇足

今回、チーム名がspiritualDBにも関わらず、DynamoDBを使ってしまった事をここにお詫び申し上げるとともに
今後、spiritualDBを作っていきたい