調用lua腳本
LuaJava實際上就是按照Lua官方文檔, 把Lua的C介面通過JNI包裝成Java的庫. 下載, 裡面是一個.dll, 一個.jar. 把.dll放到java.library.path下, 再把.lib放到classpath中, helloworld運行OK.
但是, 測試的時候, 很快發現了第一個問題: 在調用LuaJava中提供的LuaState.pushInteger方法的時候, 出現了錯誤 :Unsatisfied Link Error. 其他的LuaState.pushNumber方法倒是沒有問題. 用Depends工具看了下, 這個.dll居然沒有導出pushInteger這個函數。
(1).下載LuaJava的源代碼, 查看了下Luajava.c 和 Luajava.h, 發現果然裡面有點問題, 在.h裡面定義了JNI中對應Java函數的C函數
JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger
但是.c中沒有實現這個函數. 無語, 看來大馬虎哪都有啊. 幸虧有源代碼, 照貓畫虎在Luajava.c中加上這個函數的實現,
(2).然後編譯. 編譯也出現了問題了, 官方文檔中說可以用VC++來Build, 但是沒有說官方用的是什麼版本. 我用VC2005就不行. 好在Luajava比較小, 就一個.h 一個 .c , 在VC中新建一個.dll項目, 把文件加進去, 修改一下build參數 (Include 需要加上lua的頭文件, lib中需要加上lua的.lib文件, 另外要選上Compile as C Code (/TC)) Build, 通過了.
這時再在Java中調用pushInteger方法就沒有問題了.
在測試中, 發現Luajava提供的文檔中, 對於Lua腳本怎麼調用Java對象/方法很詳細, 但是在Java中怎麼調用Lua函數/取得返回值 就沒有. 參考了http://www.lua.org/manual/5.1/manual.html#lua_CFunction的Lua C文檔, 實現了傳遞對象到Lua中並取得返回值的代碼:
Test1: 測試傳遞簡單類型, 並取得返回值:
Lua 腳本(test.lua):
function test(a,b)
return a+b
end
Java代碼:
static {
//載入Lua5.1.dll, 因為LuaJava最後還是要調用Lua的東西
System.loadLibrary("lua5.1");
}
public static void main(String[] argu) throws LuaException {
LuaState L = LuaStateFactory.newLuaState();
L.openLibs();
//讀入Lua腳本
int error = L.LdoFile("test.lua");
if (error != 0) {
System.out.println("Read/Parse lua file error. Exit.");
return;
}
//找到函數test
L.getField(LuaState.LUA_GLOBALSINDEX, "test");
//參數1壓棧
L.pushInteger(1);
//參數2壓棧
L.pushInteger(2);
//調用!! 一共兩個參數, 1個返回值
L.call(2, 1);
//保存返回值, 到a中
L.setField(LuaState.LUA_GLOBALSINDEX, "a");
//讀入a
LuaObject l = L.getLuaObject("a");
//列印結果.
System.out.println("Result is " + l.getString());
L.close();
}
測試2: 傳遞Java對象
class Value {
public int i;
public void inc() {
i++;
}
public int get() {
return i;
}
public String toString() {
return "Value is " + i;
}
}
Lua腳本: (該腳本中調用兩次對象的inc方法, 並調用get方法輸出結果)
function test1(v)
v:inc();
v:inc();
print("In lua: " .. v:get());
return v
end
Java 代碼: (前面都一樣, 略)
//找到函數est1
L.getField(LuaState.LUA_GLOBALSINDEX, "test1");
//生成新的對象供測試
Value v = new Value();
//對象壓棧
L.pushObjectValue(v);
//調用函數test1, 此時1個參數, 1個返回值
L.call(1, 1);
//結果放在b中.
L.setField(LuaState.LUA_GLOBALSINDEX, "b");
LuaObject l = L.getLuaObject("b");
System.out.println("Result is " + l.getObject());
總結:運行結果:
Result is Value is 2
In lua: 2
和預期的一致.
⑵ Lua腳本怎麼樣調用外部腳本
若要調用外部Lua腳本,需要使用dofile。
這很像C語言中的
#include「」
用法:dofile
("路徑")
==================
--File:E:\lua1.lua
dofile
("Hello.lua")
print(a)
==================
--File:
E:\Hello.lua
a
=
100
==================
==輸出==
100
⑶ 怎樣在lua腳本中調用另一個lua腳本中的函數呢
require「函數腳本文件名字」
下面可以直接調用,也可以使用pcall方法安全調用
⑷ 關於在C++中調用lua腳本的幾個簡單問題、、求達人!3Q!
lua_State* p = lua_open();
//創建lua虛擬機的環境。#define lua_open() luaL_newstate()
luaopen_base(p);
luaopen_math(p);
luaopen_string(p);
//以上加入這些庫,就像C包含頭文件
lua_settop(p, 0);
//清空棧空間
lua_getglobal(p, "key");
//取一個全局變數為「key」,壓入棧頂
int temp = lua_isstring(p, 1);
//當判斷值是一個字元串或是一個數字(數字總能轉換成字元串)時,返回 1 ,否則返回 0
const char* str = lua_tostring(p, 1);
//把棧頂的數據轉換成字元串。這個函數沒有出棧功能,
可以使用lua_pop(p,1)將棧頂元素彈出
lua_close(p);
//釋放資源
⑸ 如何調用lua腳本進行防禦快速入門
先編寫 Lua腳本 /root/lua_script_modsecurity/ xss_detect.lua
vim xss_detect.lua
local string_find = string.find
local m_getvars = m.getvars
local m_log = m.log
function main()
⑹ 請問自己的軟體如何運行Lua腳本
programming in lua 有相關的例子,一般腳本語言和c/c++之類的互相調用分兩類,一類是擴展,就是將c/c++模塊封裝起來給腳本語言用,用swig做封裝很方便的,一類是嵌入,就是在c/c++等應用中嵌入lua引擎,一般是用來分離經常變化的邏輯部分,比如WOW就是用lua語言作為擴展,用戶可以編寫lua腳本來完成一些特定功能的機器人。你要做的就是使用lua c api來在你的程序中執行lua。類似這種:
int iErr = 0;
lua_State *lua = lua_open (); // Open Lua
luaopen_io (lua); // Load io library
if ((iErr = luaL_loadfile (lua, "test.lua")) == 0)
{
// Call main...
if ((iErr = lua_pcall (lua, 0, LUA_MULTRET, 0)) == 0)
{
// Push the function name onto the stack
lua_pushstring (lua, "helloWorld");
// Function is located in the Global Table
lua_gettable (lua, LUA_GLOBALSINDEX);
lua_pcall (lua, 0, 0, 0);
}
}
lua_close (lua);
⑺ 關於vc6.0調用lua腳本問題
我把鏈接發送給你的郵件里。 Lua程序下載後完成
解壓到任何文件夾上你的假設是d:\ LUA。
然後系統環境變數PATH裡面添加廣告:\ LUA從其他路徑用分號分隔的。如何WIN環境變數,你到網上搜搜。
然後你開始處輸入lua52 abc.lua開始的Lua語言解釋器。
然後你了Lua擴展名的文件的打開方式,找到這個程序。
你雙擊lua文件可以被執行。
⑻ 如何在C++類型的工程中使用lua腳本
c++和lua混編的,工程主體是c++的,然後部分模塊採用了Lua,方便熱更。我們是新建了一個Lua工程,然後把之前c++工程的代碼全部拷貝Lua工程里,在Lua工程里做一個CppLuaManager的管理器,可以直接調用運行lua腳本,往c++層加界面,傳遞數據,都可以。這樣之前的c++工程代碼也可以運行,新的lua代碼也可以運行,就是交互數據的時候有點麻煩,不過基本滿足我們項目的需求
⑼ 如何在JS中執行lua腳本
不可以的,lua只能在伺服器上運行、無法在客戶端運行,js是客戶端腳本、在客戶的瀏覽器上執行。
⑽ C++調用lua腳本 問題
',就可以調用了。看看error是什麼,根據信息去調錯。
lua編譯器也就是解釋器,所謂腳本就是載入時編譯嘛!
另:調試腳本的方法就是靠log來分析了。lua調用函數當然用文本,要不怎麼調。