如何讓Lua集成到自己的Android游戲
如何讓Lua集成到自己的Android游戲是本文要介紹的內(nèi)容,當(dāng)前眾多游戲引入腳本語言作為快速發(fā)布內(nèi)容以及靈活擴展的解決方案,在尋找向Android應(yīng)用集成Lua腳本語言的方案時,大量零碎的資料并沒有向開發(fā)者指引一個明確的方向。在這里我把自己通過整合資料完成的方案寫下來,希望能給需要的程序員幫助,歡迎大家提供更快捷的方案。
不再贅述Android開發(fā)環(huán)境的配置以及Lua腳本語言的介紹,需要了解的朋友可以Google資料。
我的開發(fā)環(huán)境是Window,列舉我們將要用到的工具和組件:
- Native Development Kit r6 http://developer.android.com/sdk/ndk/index.html
- Cygwin 1.7 http://www.cygwin.com/
- Lua 5.1.4 source http://www.lua.org/
- luajava 1.1 source http://www.keplerproject.org/luajava/manual.html
簡要介紹解決方案涉及到的幾個基本概念,高手自動略過:
Lua用C實現(xiàn),所以如果我們不打算用Java重寫解釋器的話,我們需要一種方式使C和Java能良好的溝通,熟悉Java的程序員肯定想到了JNI(Java Native Interface)。你可能在Linux環(huán)境和Window環(huán)境使用過JNI,過程并不復(fù)雜:寫好Java文件并在其中聲明好native方法→用javah生成C頭文件→為C文件中聲明的函數(shù)寫好實現(xiàn)→編譯C代碼生成動態(tài)鏈接庫,這樣就可以在Java中使用native方法了。
在Android下我們同樣要經(jīng)過這些步驟,只不過編譯生成動態(tài)鏈接庫的時候我們需要Google提供的NDK工具。在Window環(huán)境下使用NDK還需要安裝UNIX模擬環(huán)境Cygwin。我們還將用到一個對Lua進行良好封裝的開源項目luajava。
下面開始詳細步驟:
安裝Cygwin,下載到的setup是一個安裝器,負責(zé)在線或者本地找到安裝需要的文件并執(zhí)行安裝,建議把文件下載到本地以備下次使用,安裝過程執(zhí)行到選擇安裝包時一定確定All結(jié)點(樹形結(jié)點的根結(jié)點)在Install狀態(tài)以免需要的包不被安裝,如果是在線安裝時間會很長,耐心等待過后Cygwin安裝成功。
安裝NDK,NDK是一個壓縮文件,下載完成解壓縮(建議解壓縮到一個方便輸入路徑的目錄)。
下載上面lua和luajava的源代碼并解壓縮到任意目錄。
在任意目錄創(chuàng)建luajava4android(名字可以任意)目錄,在目錄下創(chuàng)建子目錄jni(名字指定為jni),把lua和luajava中的C文件(包括頭文件和源文件)都拷入該目錄,并在該目錄下創(chuàng)建Android.mk文件,拷貝下面內(nèi)容至文件:
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_ARM_MODE := arm
- LOCAL_MODULE := luajava-1.1
- LOCAL_SRC_FILES := lapi.c \
- lauxlib.c \
- lbaselib.c \
- lcode.c \
- ldblib.c \
- ldebug.c \
- ldo.c \
- ldump.c \
- lfunc.c \
- lgc.c \
- linit.c \
- liolib.c \
- llex.c \
- lmathlib.c \
- lmem.c \
- loadlib.c \
- lobject.c \
- lopcodes.c \
- loslib.c \
- lparser.c \
- lstate.c \
- lstring.c \
- lstrlib.c \
- ltable.c \
- ltablib.c \
- ltm.c \
- lundump.c \
- lvm.c \
- lzio.c \
- print.c \
- luajava.c include $(BUILD_SHARED_LIBRARY)
運行Cygwin安裝目錄下的Cygwin.bat進入命令行界面,進入剛才建立的luajava4android路徑,執(zhí)行ndk-build,成功以后就會在目錄下生成一個lib目錄,里面以.so為后綴名的文件即為我們需要的動態(tài)鏈接庫文件。
把luajava中的java源代碼導(dǎo)入到自己的Android工程中,在工程目錄下建立\libs\armeabi\結(jié)構(gòu)的路徑,并把動態(tài)鏈接庫文件拷入,刷新工程,這樣我們就完成了所有的步驟,并不復(fù)雜,可以寫一個簡單的實例來驗證Lua環(huán)境是否搭建好了。
- package com.android.hello;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- import org.keplerproject.luajava.*;
- public class HelloAndroidActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- LuaState L = LuaStateFactory.newLuaState();
- L.openLibs();
- L.LdoString("text = 'Hello Android, I am Lua.'");
- L.getGlobal("text");
- String text = L.toString(-1);
- super.onCreate(savedInstanceState);
- TextView tv = new TextView(this);
- tv.setText(text);
- setContentView(tv);
- }
- }
下面是運行結(jié)果圖:
到此Android下的Lua環(huán)境就配置好了,至于怎么運用就看各位程序員的設(shè)計了。
小結(jié):如何讓Lua集成到自己的Android游戲的內(nèi)容介紹完了,西瓦過通過本文的學(xué)習(xí)能對你有所幫助!