読者です 読者をやめる 読者になる 読者になる

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が表示されない<-今ココ

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