Android平台下使用lua調用Java代碼經驗總結


動態語言以其執行的靈活性,可配置性。方便調試能夠為開發帶來極大的方便。假設用好了。能夠極大的提高開發的效率。


怪不得像游戲開發這樣復雜的軟件開發里沒有不集成腳本語言的。


當中,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












免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM