當前位置:首頁 » 編程軟體 » 調用lua腳本

調用lua腳本

發布時間: 2022-07-24 11:00:36

⑴ 如何在java中使用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調用函數當然用文本,要不怎麼調。

熱點內容
我的世界伺服器卡領地 發布:2025-02-06 08:50:45 瀏覽:255
我的世界公網ip伺服器 發布:2025-02-06 08:46:28 瀏覽:772
php數組值求和 發布:2025-02-06 08:30:56 瀏覽:819
java類可以作為 發布:2025-02-06 08:28:54 瀏覽:412
sql更改列 發布:2025-02-06 08:22:37 瀏覽:396
創建索引sql 發布:2025-02-06 08:22:29 瀏覽:235
西門子有密碼如何初始化 發布:2025-02-06 08:22:28 瀏覽:594
EV壓縮 發布:2025-02-06 08:21:13 瀏覽:336
配置氯化錫時為什麼要加錫粒 發布:2025-02-06 08:19:33 瀏覽:64
阿里雲伺服器存放在哪裡 發布:2025-02-06 08:11:15 瀏覽:156