何か作ろうと思ってるけど下準備中、cocos2dxとlua使う予定。
だらだらといろいろ試したことのメモ。
エミュレータと実機つないでるので指定する方法
adb devices でシリアル確認
adbコマンドにANDROID_SERIAL=xxxでシリアルを指定する
adb -s xxxでもいいけど、別のスクリプトとかからadbしてるときに微妙。
エミュレータ、実機が1台ずつならadb -eとかadb -dでもいい。
cocos2dxのsamples/lua/HelloLuaをいじってみる。
apk内部のassetsにluaファイルを置いておくと
require "ファイル名"で読めるらしい
luaからファイルを作成してみる
fh = io.open("/data/data/org.cocos2dx.hellolua/files/test.txt", "w")
fh:write("abcde\n")
fh:close()
Genymotionで動かすためにx86もビルドするようにする
jni/Application.mk
に
APP_ABI := x86 armeabi
を追加する。
lua言語慣れてないのでlua+cygwinでとりあえずインタラクティブなやつで試す
make mingw
cd src
lua -i
luaマニュアルを軽く見ておくといい
他の言語知っていれば簡単だと思う
PHPとjavascriptをくっつけてうさんくさい動作を省いたみたいな印象
http://milkpot.sakura.ne.jp/lua/lua51_manual_ja.html
スクリプトの中で作成したスクリプトを読み込んでみる
fh = io.open("/data/data/org.cocos2dx.hellolua/files/test.lua", "w")
fh:write("function myadd2(x, y)\n");
fh:write(" return x + y + 1\n");
fh:write("end\n");
fh:close()
package.path = "/data/data/org.cocos2dx.hellolua/files/?.lua"
require("test");
cclog("result2 is " .. myadd2(1, 1))
スクリプトの中で作成しなくても、
adb pushで/data/data/org.cocos2dx.hellolua/files/におけば、
同じようにrequireできるのでそうすれば
それなりに時間かかるAPKビルドを省略できるので結構楽そう。
rootじゃないと権限の問題でfilesにファイルを作成するのがちょっと面倒
adb shell "run-as org.cocos2dx.hellolua sh -c 'echo \"aaa\nbbb\nccc\" > /data/data/org.cocos2dx.hellolua/files/test.txt'"
みたいな感じ。
echoに渡す文字列のエスケープがややこしい。
シングルクオートが'\''
ダブルクオートが\\\"
adb pushでrun-asみたいのを指定する方法があればいいのだけど。
luaからc++を呼ぶには
tools/tolua++でmakeする
apt-get install tolua++しておく
scripting/lua/cocos2dx_support/LuaCocos2d.cppに作成される
自分で作った関数とかをtoluaするには
http://p-monster.hatenablog.com/entry/2012/12/12/170111
ここを参考にしました。
samples/Lua/HelloLua/tolua_glue/sample.pkgを作成
tolua++5.1 -n sample -o sample_glue.cpp -H sample_glue.h sample.pkg
でsample_glue.cppとsample_glue.hを作成。
同じディレクトリに参考記事のluasample.h, luasample.cppを作成
Android.mkの
LOCAL_SRC_FILESにluasample.cppとsample_glue.cppを追加
LOCAL_C_INCLUDESにtolua_glueとexternal/emscripten/tests/lua/srcを追加
AppDeletete.cppに
#include "lua.hpp"
#include "tolua++.h"
#include "sample_glue.h"
を追加。
applicationDidFinishLaunchingの中で
lua_State* state = pEngine->getLuaStack()->getLuaState();
tolua_sample_open(state);
すると、以降でGetStringが呼べるようになる。