lua
语法
-
函数的可变参数
5.1之前: 直接用arg[1]等表示 5.1: 使用...代替arg 5.2: 需要自己打包 local arg = table.pack(...) 然后用arg[1],#arg等
lua安装
- 提示"luaconf.h:275: fatal error: readline/readline.h: No such file or directory"
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
-
运行时出错,提示
PANIC: unprotected error in call to Lua API (no calling environment)
使用 luaL_openlibs(L);//lua5.1.3+ 代替 luaopen_base(L);//lua5 luaopen_table(L); luaopen_io(L); luaopen_string(L); luaopen_math(L); ...
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); }