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

來源:互聯網
上載者:User

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

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


怪不得像遊戲開發這樣複雜的軟體開發裡沒有不整合指令碼語言的。


其中,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);
因為FLAG_ACTIVITY_NEW_TASK是Intent的一個靜態變數,所以必須這樣調用:


intent.FLAG_ACTIVITY_NEW_TASK


如果寫成:


intent:FLAG_ACTIVITY_NEW_TASK


就錯了。


還有,上面的代碼和下面的代碼相當:
    intent.setFlags(intent,intent.FLAG_ACTIVITY_NEW_TASK);






再來看一個例子:


require 'import'button_cb = {}function button_cb.onClick(ev)    print('hello,world')    launchSetting(activity)endlocal 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裡的一個靜態類,所以引用Button的資源檔用下面的代碼:


id.launchButton


而不是id:launchButton


另外,注意類中類的引用方法,如:


android.view.View$OnClickListener












lua怎調用java程式

Lua是一個實用的指令碼語言,相對於Python來說,比較小巧,但它功能並不遜色,特別是在遊戲開發中非常實用(WoW採用的就是Lua作為指令碼的)。Lua在C\C++的實現我就不多說了,網上隨便一搜,到處都是這方面的介紹,我想說的是如何在Java下使用Lua以提高編程效率、增強你的程式可擴充性。

首先,要在Java上使用Lua指令碼,必須有關於Lua指令碼解譯器以及Java程式可以訪問這些指令碼的相關API,即相關類庫。我使用的是一個叫做LuaJava的開源項目,可以在: www.keplerproject.org/luajava/ 找到LuaJava的類庫以及原始碼,使用文檔資等

下載下來解壓後包括兩個檔案(我下載的是1.1版本的): luajava-1.1.jar 檔案和 luajava-1.1.dll動態串連庫檔案

luajava-1.1.jar就容易了,就是將其加入你的項目的ClassPath中,以便程式可以使用它提供的API

luaJava-1.1.dll就麻煩了,你必須將其加入你的Windows安裝目錄下,比如你用的是XP,安裝在C盤,那就直接將其加入C:\WINDOWS目錄下即可,當然你也可以將其加入你的JDK下的jre下

好了,現在你的項目就可以使用Lua指令碼來實現動態擴充功能了!不過不要急,你還得有工具來寫Lua指令碼吧?不可能用記事本來寫吧???????

你可以使用UltraEdit,但你用UE開啟lua檔案後,會發現和記事本差不多,並沒有高亮(可能新版本的支援Lua指令碼了),如果你的UE不支援,那麼先去UltraEdit的官網下載支援Lua的Wordfiles檔案(www.ultraedit.com/files/wf/lua.txt),是個文字檔(lua.txt)。開啟UltraEdit安裝目錄下的wordfile.txt,把lua.txt檔案中的內容拷貝粘貼到wordfile.txt的末尾,存檔,OK,於是UltraEdit文法高亮項多出Lua一項,可以選擇使用了。其他語言的文法高亮支援與此類似。

但你如果是Java開發人員,應該都用過Eclipse吧?可否在Eclipse下直接就寫Lua指令碼呢?答案是可以的!

這當然是Eclipse的強大的外掛程式管理功能啦,你可以去下載luaeclipse外掛程式來使你的Eclipse擁有編寫Lua指令碼的能力(既可以高亮顯示你的指令碼,是不是很爽呢),你可以在這裡下載:www.ideais.com.br/luaeclipse/

下載後安裝後,你的Eclipse就可以建立和編寫Lua指令碼了,注意設定一下喜好設定中關於LUA的屬性(Eclipse安裝外掛程式就不用我說了吧????)

好了,現在一切都準備好了,讓我們來一個HelloWorld吧!

首先在......餘下全文>>
 
在android下使用lua,lua調用c++編譯好的so裡的一個函數,這個函數又調用lua裡的一個函數

沒聽說過lua入棧太多自動彈出棧的功能,只碰到過超過設定的堆棧最大層數提示too many nested functions或者stack overflow。樓主的提示在lua源碼裡也沒搜到。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.