2014年2月15日土曜日

毎秒

windows上のVirtualBoxのUbuntuで開発してて、
windows上で動いてるgenymotionにadbでちょっかい出したくなった。

sshd動かそうとしたけどwindows難しすぎた。

仕方ないのでUbuntuからは共有フォルダに実行するスクリプトを書き込んで、
windowsの方で毎秒ファイル監視するスクリプトを書いて、
ファイル変わってたら変更されたスクリプトを実行するようにしてみた。

ださいし平均0.5秒遅れるけど、動かないよりはだいぶまし。

2014年2月6日木曜日

cocos2dx2.xにluasocket

3beta2以降は標準で使えるようになったので不要です。

タイミング悪く2.2.2に無理やり組み込んだのでメモ。
とりあえず動けばいいと思って雑にやった。
ndkとcocosとluaの初心者なのでこんなやり方でいいのかはわからないけど一応動いた。


以下手順

luasocketに入ってる.cと.hをどっかにおく
luasocket/srcあたり
luasocket.cはluaopen_socket_coreをコピーしてluaopen_libluasocketにした。


luasocketに入ってる.luaをどっかにおく
scripts/socketあたり

socket.core.luaだけはscripts/socket.luaにして
local socket = require("socket.core")

local socket = require("libluasocket")
に変える。
cpathからsoファイル探すらしいので。




Android.mkに
include $(CLEAR_VARS)
LOCAL_MODULE := luasocket
LOCAL_SRC_FILES := .c全部

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../luasocket/src
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../../../scripting/lua/luajit/LuaJIT-2.0.1/src/

LDFLAGS += -lgcc -lc

LOCAL_SHARED_LIBRARIES := hellolua_shared

include $(BUILD_SHARED_LIBRARY)

って感じでlibluasocket.soを作るようにさせる。


package.cpathに追加
/data/data/org.cocos2dx.hellolua/lib/?.so

package.pathにはscriptsに対応するところを追加


require("socket")すれば使えるはず。

2014年1月7日火曜日

cocos2dxとか

何か作ろうと思ってるけど下準備中、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が呼べるようになる。