当前众多游戏引入脚本语言作为快速发布内容以及灵活扩展的解决方案,在寻找向Android应用集成Lua脚本语言的方案时,大量零碎的资料并没有向开发者指引一个明确的方向。在这里我把自己通过整合资料完成的方案写下来,希望能给需要的程序员帮助,欢迎大家提供更快捷的方案。
不再赘述Android开发环境的配置以及Lua脚本语言的介绍,需要了解的朋友可以Google资料。
我的开发环境是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
简要介绍解决方案涉及到的几个基本概念,高手自动略过:
Java Native Interface)。你可能在Linux环境和Window环境使用过JNI,过程并不复杂:写好Java文件并在其中声明好native方法→用javah生成C头文件→为C文件中声明的函数写好实现→编译C代码生成动态链接库,这样就可以在Java中使用native方法了。在Android下我们同样要经过这些步骤,只不过编译生成动态链接库的时候我们需要Google提供的NDK工具。在Window环境下使用NDK还需要安装UNIX模拟环境Cygwin。我们还将用到一个对Lua进行良好封装的开源项目luajava。
下面开始详细步骤:
- 安装Cygwin,下载到的setup是一个安装器,负责在线或者本地找到安装需要的文件并执行安装,建议把文件下载到本地以备下次使用,安装过程执行到选择安装包时一定确定All结点(树形结点的根结点)在Install状态以免需要的包不被安装,如果是在线安装时间会很长,耐心等待过后Cygwin安装成功。
- 安装NDK,NDK是一个压缩文件,下载完成解压缩(建议解压缩到一个方便输入路径的目录)。
- 下载上面lua和luajava的源代码并解压缩到任意目录。
- 在任意目录创建luajava4android(名字可以任意)目录,在目录下创建子目录jni(名字指定为jni),把lua和luajava中的C文件(包括头文件和源文件)都拷入该目录,并在该目录下创建Android.mk文件,拷贝下面内容至文件:
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路径,执行ndk-build,成功以后就会在目录下生成一个lib目录,里面以.so为后缀名的文件即为我们需要的动态链接库文件。
- 把luajava中的java源代码导入到自己的Android工程中,在工程目录下建立\libs\armeabi\结构的路径,并把动态链接库文件拷入,刷新工程,这样我们就完成了所有的步骤,并不复杂,可以写一个简单的实例来验证Lua环境是否搭建好了。
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);
}
}
下面是运行结果图:
到此Android下的Lua环境就配置好了,至于怎么运用就看各位程序员的设计了。