lua


语法

lua安装

sudo apt-get install libreadline6 libreadline6-dev

test.lua:

# i am test
print('hello world');

使用 lua test.lua 测试效果

c调用lua

test.c:

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

int main()
{
    lua_State *L = lua_open();
    luaL_openlibs(L);
    luaL_dofile(L,"test.lua");
    lua_close(L);
    return 0;
}

Makefile:

all: test.c
	gcc -I/usr/local/include/ -L/usr/local/lib/ -ldl -lm -DLUA_USE_READLINE test.c /usr/local/lib/liblua.a -o test

使用 ./test test.lua 测试效果

c源码调用lua

加入lua的src中的所有c文件至Makefile, 除了lua.c和luac.c
Makefile:

SRC = \
lua/lapi.c \
lua/lauxlib.c \
lua/lbaselib.c \
lua/lcode.c \
lua/ldblib.c \
lua/ldebug.c \
lua/ldo.c \
lua/ldump.c \
lua/lfunc.c \
lua/lgc.c \
lua/linit.c \
lua/liolib.c \
lua/llex.c \
lua/lmathlib.c \
lua/lmem.c \
lua/loadlib.c \
lua/lobject.c \
lua/lopcodes.c \
lua/loslib.c \
lua/lparser.c \
lua/lstate.c \
lua/lstring.c \
lua/lstrlib.c \
lua/ltable.c \
lua/ltablib.c \
lua/ltm.c \
lua/lundump.c \
lua/lvm.c \
lua/lzio.c \
lua/print.c \

all: test.c
	gcc -Ilua/ -lm test.c $(SRC) -o test

Android NDK 使用lua

Android.mk

LOCAL_PATH:= $(call my-dir)

## lua
include $(CLEAR_VARS)

LOCAL_MODULE := lua
LOCAL_ARM_MODE   := arm
LOCAL_CFLAGS    := -Werror -DLUA_USE_LINUX
LOCAL_LDLIBS := -lm
LOCAL_C_INCLUDES := $(LOCAL_PATH)/lua
LOCAL_SRC_FILES :=  \
lua/lapi.c \
lua/lauxlib.c \
lua/lbaselib.c \
lua/lcode.c \
lua/ldblib.c \
lua/ldebug.c \
lua/ldo.c \
lua/ldump.c \
lua/lfunc.c \
lua/lgc.c \
lua/linit.c \
lua/liolib.c \
lua/llex.c \
lua/lmathlib.c \
lua/lmem.c \
lua/loadlib.c \
lua/lobject.c \
lua/lopcodes.c \
lua/loslib.c \
lua/lparser.c \
lua/lstate.c \
lua/lstring.c \
lua/lstrlib.c \
lua/ltable.c \
lua/ltablib.c \
lua/ltm.c \
lua/lundump.c \
lua/lvm.c \
lua/lzio.c \
lua/print.c \

include $(BUILD_STATIC_LIBRARY)


## main
include $(CLEAR_VARS)

LOCAL_MODULE    := luandroid
LOCAL_ARM_MODE   := arm
LOCAL_CFLAGS    := -Werror
LOCAL_STATIC_LIBRARIES := lua
LOCAL_LDLIBS := -llog
LOCAL_C_INCLUDES := $(LOCAL_PATH)/lua/
LOCAL_SRC_FILES :=  jni.c 

include $(BUILD_SHARED_LIBRARY)

jni.c

#include <string.h>
#include <jni.h>

#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

#include <android/log.h>
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR  , "zz", __VA_ARGS__)

void load (const char *filename, int *width, int *height) {
    lua_State *L = lua_open();
    luaL_openlibs(L);

    if (luaL_loadfile(L, filename) || lua_pcall(L, 0, 0, 0))
        LOGE( "cannot run configuration file: %s",
              lua_tostring(L, -1));

    lua_getglobal(L, "width");
    lua_getglobal(L, "height");
    if (!lua_isnumber(L, -2))
        LOGE("`width' should be a number\n");
    if (!lua_isnumber(L, -1))
        LOGE("`height' should be a number\n");
    *width = (int)lua_tonumber(L, -2);
    *height = (int)lua_tonumber(L, -1);

    lua_close(L);
}

jstring
Java_com_zzfreedom_luandroid_Luandroid_loadluaconfig( JNIEnv* env,
                                                  jobject thiz, jstring path )
{
    int w,h;
    char s[256];
    const char *pathl = (*env)->GetStringUTFChars(env, path, 0);
    load (pathl, &w, &h);
    sprintf(s,"w=%d\nh=%d\n",w,h);
    return (*env)->NewStringUTF(env, s);
}