動態語言以其執行的靈活性,可配置性。方便調試能夠為開發帶來極大的方便。假設用好了。能夠極大的提高開發的效率。
怪不得像游戲開發這樣復雜的軟件開發里沒有不集成腳本語言的。
當中,lua以其小巧,靈活。方便擴展,方便嵌入被用於大多數的游戲開發中。
可是在Android平台。在試過Python后,發現盡管集成也不是什么困難的事,可是感覺它還是有點大,一個動態庫就有3M多,python庫還得自己去裁剪,
編譯也不是非常方便。所以近期把注意力漸漸的放到了lua這樣的工具上。對照了下lua。盡管lua沒有像Python那么純粹,可是感覺這樣的劣勢反到是成了它的優勢。
不得不說在Android平台上,lua比python更有用。正所謂,沒有最好。僅僅有最合適。
Python在追求純粹的同一時候,卻也阻礙了它的發展。
對於每一個視效率為生命的開發者來說。方便有用才是王道。
由於這意味着能夠盡快的完畢軟件的開發,能夠減少軟件開發的風險。能夠少些開發的壓力,能夠少熬些夜,能夠多點陪女朋友的時間(哈,程序猿那有女朋友啊)。
扯遠了,回到標題,看下怎樣在Android平台上用luajava來使lua和java融為一體。
luajava在android平台上已經有了移植,代碼能夠從https://github.com/mkottman/AndroLua下載。
至於編譯和把luajava增加自己的項目中,不多講,參考AndroLua的代碼就能夠了。以下來關注一下怎樣用lua來和android進行交互:
最簡單的一個樣例:
function launchSetting(context) intent = luajava.newInstance("android.content.Intent") c = luajava.newInstance("android.content.ComponentName","com.android.settings", "com.android.settings.Settings") intent:setFlags(intent.FLAG_ACTIVITY_NEW_TASK); intent:setComponent(c) context:startActivity(intent) end
該演示樣例能夠用來啟動“設置”
一行一行來解釋下:
intent = luajava.newInstance("android.content.Intent")
創建一個Intent實例:相當於Java里的 Intent intent = new Intent()
c = luajava.newInstance("android.content.ComponentName","com.android.settings", "com.android.settings.Settings")
創建一個ComponentName實例,相當於Java代碼:ComponentName c = new ComponentName("com.android.settings", "com.android.settings.Settings")
intent:setFlags(intent.FLAG_ACTIVITY_NEW_TASK);
啟動一個新的Activity實例
intent:setComponent(c)
context:startActivity(intent)
啟動Activity
剛開始學lua的同學可能對"."和":"的有些陌生。這里簡單解析一下,"."是用來調用類的方法,而":"是用來調用對象的方法。
請看以下這行代碼:
intent:setFlags(intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(intent,intent.FLAG_ACTIVITY_NEW_TASK);
假設寫成:
intent.setFlags(intent.FLAG_ACTIVITY_NEW_TASK);
就會返回錯誤:
Not a valid OO function call
由於第一個參數intent.FLAG_ACTIVITY_NEW_TASK不是一個對象。再來看一個樣例:
require 'import' button_cb = {} function button_cb.onClick(ev) print('hello,world') launchSetting(activity) end local id = luajava.bindClass("sk.kottman.androlua.R$id") local launch = activity:findViewById(id.launchButton) buttonProxy = luajava.createProxy("android.view.View$OnClickListener", button_cb) launch:setOnClickListener(buttonProxy)
這個樣例展示了luajava.createProxy的使用,該樣例注冊了一個按扭的Click的Listener
注意下面代碼:
local id = luajava.bindClass("sk.kottman.androlua.R$id")
local launch = activity:findViewById(id.launchButton)
由於id是R.java里的一個靜態類,所以不能寫成:sk.kottman.androlua.R.id:
另外,注意類中類的引用方法,如:
android.view.View$OnClickListener