當前位置:首頁 » 網頁前端 » 中文路徑載入lua腳本
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

中文路徑載入lua腳本

發布時間: 2022-09-08 11:36:18

㈠ 如何在Java中使用Lua腳本語言

如何在Java中使用Lua腳本語言是本文要介紹的內容,主要是來學習LUA腳本語言在JAVA中如何來使用,Lua就不說了, 現在比較熱門, 語法也很簡單. 為了在Java中調用, 折騰了比較長的時間, 就把一些東西記在下面.來看詳細內容講解。
Lua是支持內嵌在C程序中的, 但是官方不支持Java. 在網上查了下, 有LuaJava開源庫, 拿來試用了一下, 發現這個庫還算比較完善的.

這個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這個函數. 暈....
下載LuaJava的源代碼, 查看了下Luajava.c 和 Luajava.h, 發現果然裡面有點問題, 在.h裡面定義了JNI中對應Java函數的C函數
JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger
但是.c中沒有實現這個函數. 無語, 看來大馬虎哪都有啊. 幸虧有源代碼, 照貓畫虎在Luajava.c中加上這個函數的實現,
JNIEXPORT void JNICALL Java_org_keplerproject_luajava_LuaState__1pushInteger (JNIEnv * env, jobject jobj, jobject cptr, jint i) { lua_State * L = getStateFromCPtr( env , cptr ); lua_pushinteger(L, i); }

然後編譯. 編譯也出現了問題了, 官方文檔中說可以用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 代碼: (前面都一樣, 略)
//找到函數test1 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里的設定當作初始狀態傳給monstor,名字為sample monstor,防禦10,攻擊10,生命100
1.先導入lib--luajava-1.1.jar
import org.keplerproject.luajava.LuaState; import org.keplerproject.luajava.LuaStateFactory; public class Load{ LuaState luaState; /** * Constructor * @param fileName File name with Lua . */ Load(final String fileName) { this.luaState = LuaStateFactory.newLuaState(); this.luaState.openLibs(); this.luaState.LdoFile(fileName); } /** * Ends the use of Lua environment. */ void close() { this.luaState.close(); } /** * Call a Lua inside the Lua to insert * data into a Java object passed as parameter * @param Name Name of Lua . * @param obj A Java object. */ void run(String Name, Object obj) { this.luaState.getGlobal(Name); this.luaState.pushJavaObject(obj); this.luaState.call(1,0); } } public class Monster{ /* Info */ protected String race; protected int defense; protected int attack; protected int life; /* */ private Load ; public Monster(String race) { /* Loads Lua for this race.*/ this. = new Load(race+".lua"); /*Call Lua create .*/ .run("create", this); } public void setRace(String race) { this.race = race; } public String getRace() { return race; } public int getDefense() { return this.defense; } public void setDefense(int defense) { this.defense = defense; } public int getLife() { return this.life; } public void setLife(int life) { this.life = life; } public void setAttack(int attack) { this.attack = attack; } public int getAttack() { return this.attack; } } monstor.lua--- create(monster) monster:setRace("Sample Monster") monster:setDefense(10) monster:setAttack(10) monster:setLife(100) end

但總是拋出這個錯誤:
PANIC: unprotected error in call to Lua API (Invalid method call. No such method.)

不知為何,以後用到的時候再research.
已經查出來,原來在Monster類中少了個方法:
public void setRace(String race) { this.race = race; }

怪不得會找不到,
要在一lua文件a.lua里導入其他的lua文件b.lua,用require "b"
如果要從lua中運算後得到返回參數,則需要做一下修改:在lua文件中改成:
create(monster) monster:setRace("Sample Monster") monster:setDefense(10) monster:setAttack(10) monster:setLife(100) return monster end

在Load.java中的run改成如下:
void run(String Name, Object obj) { this.luaState.getGlobal(Name); this.luaState.pushJavaObject(obj); this.luaState.call(1, 1);// 一個參數,0個返回 try { Object object =luaState.getObjectFromUserdata(1); } catch (LuaException e) { e.printStackTrace(); } }

轉載僅供參考,版權屬於原作者。祝你愉快,滿意請採納哦

㈡ lua腳本怎麼獲取當前正在執行的腳本的當前路徑

時代在發展科技在進步,互聯網已經不是什麼神秘的領域,現在越來越多的年輕人對於互聯網越來越熟悉,甚至有些開始學習Linux系統方面的知識,下面小猿圈Linux講師就講關於如何在Linux系統獲取當前工作路,希望對你有所幫助。

獲取工作路徑這里介紹兩種方法:

1、使用getcwd()函數。

頭文件:#include

定義函數:char*getcwd(char*buf,size_tsize);

函數說明:getcwd()會將當前的工作目錄絕對路徑復制到參數buf所指的內存空間,參數size為buf的空間大小。

實例:

voidgetPath()

{

charpPath[256]={0};

getcwd(buf,256);

printf("filePath:%s\n",pPath);

}

主函數調用此函數運行結果:

filePath:/home/myTest

2、使用readlink()函數

頭文件:#include<unistd.h>

函數定義:intreadlink(constchar*path,char*buf,size_tbufsiz);

函數說明:此函數會將參數path的符號連接內容到參數buf所指的內存空間,返回的內容不是以NULL作字元串結尾,但會將字元串的字元數返回。若參數bufsiz小於符號連接的內容長度,過長的內容會被截斷。成功返回buf長度,失敗返回-1。

實例:

voidgetPath()

{

charpPath[256]={0};

intret=-1;

ret=readlink("/proc/self/exe",pPath,256);

pPath[ret]="\0"

printf("thefilePath:%s\n",pPath);

}

intmain()

{

getPath();

}

運行結果:

thefilePath:/home/myTest/a.out

小猿圈Linux講師提醒大家:每天學習一點技術問題,只要功夫深,鐵杵磨成針,學習不是一朝一夕的,是需要付出行動的,而且還要堅持,學習新的技術需要不斷的查閱資料,看視頻,復習,練習,如果你工作中或者生活中遇到什麼問題,可以到小猿圈去尋找答案的,相信會給你滿意的答復

㈢ lua腳本怎麼獲取當前正在執行的腳本的當前路徑

如果在Windows下(……Linux行不行不知道)
obj=io.popen("cd") --如果不在交互模式下,前面可以添加local
path=obj:read("*all"):sub(1,-2) --path存放當前路徑
obj:close() --關掉句柄
上述原理是利用Windows的cd命令返回工作目錄;至於sub(1,-2)是為了去掉換行符
當然如果你有lua socks或者你有lfs(注意匹配你的Lua版本),你可以使用lfs(Lua File System)
require("lfs")
path=lfs.currentdir()
這個則是Lua文件系統庫中的函數。
……就是這樣

㈣ 關於vc6.0調用lua腳本問題

應該是環境問題吧。在vc6編譯後lua運行時找不到mime包在哪裡了。

㈤ 安卓手機怎麼打開.lua的腳本

安卓手機打開lua文件方法如下:

1、首先可以到官網下載一個GG,如下圖。


㈥ LUA腳本 io.open() 不能用中文文件名

你試試:
io.open("log//Recharge//10//用戶名單.txt")

把你的文件名字都改成這種形式( 把'/' 改成'//')

如果還不行就請再告訴我.

㈦ C++調用lua腳本 問題

是不是在windows下?
可能跟環境變數LUA_PATH的設置有關

㈧ 怎麼使用lua腳本

LUA腳本語言基本使用方法是本文要將介紹的內容,主要是來學習Lua腳本語言的使用方法,具體內容來看本文詳解。
先要把下邊這些語句加入到VC中的頭文件,一般是加到StdAfx.h中
extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" #pragma comment(lib, "lualib.lib") #pragma comment(lib, "lua.lib") }

然後一般來說都使用一個全局的LUA庫定義的這個東西
lua_State* g_Lua;

並且在工程處初始化時也給LUA初始化
g_Lua = lua_open(); **加這句 /* load Lua base libraries */ 網上一些教材中這么寫的 lua_baselibopen(g_Lua); 不過我這簡單的例子中不用到這些也行 lua_tablibopen(g_Lua); lua_iolibopen(g_Lua); lua_strlibopen(g_Lua); lua_mathlibopen(g_Lua);

緊接著聲明介面函數,注冊上函數
lua_register(g_Lua, "Message", myMessage);

好,初始化部分完了,看看介面函數的寫法。
函數必須這樣的格式來寫
static int Func(lua_State *L) { 靜態型函數,而且必須帶參數為lua_State結構指針 返回的值是代表返回的數據個數,比如return 2;就可以代表 返回兩個整數啊,浮點數什麼的,象LUA的腳本編寫就可以這樣 i, j = Func() , 這樣就表示可以從Func介面函數中得到兩個返回值了 return 0; }

執行腳本語句可以讀文件,也可以直接讀函數名
注冊了
lua_register(g_Lua, "Message", myMessage); static int myMessage(lua_State *L) { OutputDebugString("OK"); return 0; } lua_dofile(g_Lua, strCurPath); //讀文件,必須給出完整的文件路徑名稱 lua_dostring(g_Lua, "Message()"); //直接讀函數

文件中只要寫上
Message()

就可以了。

㈨ 如何在C++中集成LUA腳本

1. 創建Lua引擎
LuaWrap lua; 或者 LuaWrap* lua = new LuaWrap;
創建一個LuaWrap對象,就是創建一個Lua腳本引擎。並且根據Lua的特性,你可以創建任意多個Lua引擎,甚至可以分布在不同的線程當中。

2. 裝載並執行腳本程序
你可以從緩沖區中裝載Lua腳本:
lua.LoadString(
"print('Hello World')"
);
當然,你也可以從文件中裝入,並執行Lua腳本:
Lua.LoadFile("./test.lua");
Lua的腳本,可以是源代碼,也可以經過編譯後的中間代碼。也許你對編譯後的中間代碼更感興趣——如果你不希望讓源代碼赤裸裸的袒露在大家的眼前。

3. 獲取和設置Lua變數
能夠獲取和設置腳本變數的內容,是一個最基本的功能。你可以使用GetGlobal和SetGlobal函數來做到這一點:
(1) 獲取變數:
int a = lua.GetGlobal<int>("a");
LuaTable table = lua.GetGlobal<LuaTable>("t");
這里,<> 里頭的類型,就是想要的變數的類型。
(2) 設置變數:
lua.SetGlobal("a", a);
lua.SetGlobal("t", table);

4. 調用Lua函數
使用Call函數,就可以很簡單的從你的程序中調用Lua函數:
lua.Call<void>("print", "Hello World");
int sum = lua.Call<int>("add", 2, 3);
這里,<> 里頭的類型是返回值的類型。

5. 如何讓Lua也能調用C++的函數
精採的地方來了。假如有下面這樣的一個函數:
int add(int a, int b)
{
return a + b;
}
如果想讓它能夠讓Lua使用,只需將它注冊到Lua引擎當中就可以了:
lua.RegisterFunc("add", int(int,int), add);
這樣,Lua中就可以用直接使用了:
(Lua腳本)sum = add(1, 3)

(*) RegisterFunc的功能,就是讓你把C++的函數注冊到Lua中,供Lua腳本使用。
第一個參數,是想要在Lua中用的函數名。
第二個參數,是C++中函數的原型; C++允許函數重載的,你可以使用函數原型,來選擇需要注冊到Lua引擎中的那個函數。
第三個參數,就是C++中函數的指針了。

6. 如何能讓C++的類在Lua中使用
我們先看看下面這個C++類:
class MyArray
{
std::vector<double> array;
public:
void setvalue(int index, double value);
double getvalue(int index);
int size();
const char* ToString();
};

你准備要讓Lua能夠自由訪問並操作這個類。很簡單,你只需增加幾個宏定義就可以了:

class MyArray
{
std::vector<double> array;
public:
void setvalue(int index, double value);
double getvalue(int index);
int size();
const char* ToString();
// 將一個 class 作為一個 Lua 對象是很容易的,只需要增加以下宏定義。
DEFINE_TYPENAME("My.array");
BEGIN_REGLUALIB("array")
LUALIB_ITEM_create("new", MyArray ) // 創建MyArray (註:由於發表的原因,create應為全部大寫)
LUALIB_ITEM_DESTROY("del", MyArray ) // 消除MyArray。
END_REGLUALIB()
BEGIN_REGLUALIB_MEMBER()
LUALIB_ITEM_FUNC("size", int (MyArray*), &MyArray::size)
LUALIB_ITEM_FUNC("__getindex", double(MyArray*, int), &MyArray::getvalue)
LUALIB_ITEM_FUNC("__newindex", void (MyArray*, int, double), &MyArray::setvalue)
LUALIB_ITEM_FUNC("__tostring", const char* (MyArray*), &MyArray::ToString)
LUALIB_ITEM_DESTROY("__gc", MyArray ) // 垃圾收集時消除對象用。
END_REGLUALIB_MEMBER()
};

只要有了這些宏定義,這個類就是可以在Lua中使用的類了,我們就可以在Lua中注冊這個類了:
lua.Register<MyArray>()

這樣注冊以後,我們在Lua中就可以使用這個類了:
a = array.new() -- 創建對象,相當於 a = new Myarray
a[1] = 10 -- 調用__newindex,也就是C++中的 a->setvalue(1, 10)
a[2] = 20 -- 調用__newindex,也就是C++中的 a->setvalue(2, 20)
print(
a, -- 調用 __tostring,也就是C++中的 a->ToString()
a:size(), -- 相當於C++中的 a->size()
a[1], -- 調用__getindex,也就是C++中的a->getvalue(1)
a[2]) --調用__getindex,也就是C++中的a->getvalue(2)
array.del(a) -- 清除對象,相當於 delete a
a = nil -- 清空 a,很象C++中的 a = NULL

當然,你也可以不用del這個對象,而是等待Lua幫你自動進行垃圾回收。在Lua進行垃圾回收時,它會自動調用這個對象的 __gc ,相當於 delete。

那麼,在C++中要創建MyArray對象,並且傳遞給Lua全局變數怎麼辦?就象前面講過的一樣,使用SetGlobal:
MyArray* a = new MyArray;
lua.SetGlobal("a", a);
要獲取該對象,同樣的,應該使用GetGlobal:
MyArray* a = lua.GetGlobal<MyArray>("a");

對於傳遞給Lua的對象,就讓Lua來管理該對象的生存周期好了。如果你非要刪除它的話,你可以使用DelGlobalObject:
lua.DelGlobalObject<MyArray>("a");
不過這么做的話,你應當明白你在做什麼,因為在Lua的腳本中,可能已經在多處引用了這個對象了。刪除了其中一個,將導致其它引用對象失效,從而可能引致系統崩潰。

(1) DEFINE_TYPENAME("My.array");
定義類型的名稱。在Lua中,這個類型名稱是唯一用來識別C++類型的,你必須為不同的對象給予不同的名稱。

(2) BEGIN_REGLUALIB("array") … END_REGLUALIB()
你可以為一個對象定義一個程序庫,"array"就是程序庫的名字。在程序庫中定義的函數是全局函數,在Lua中,使用該函數,需要在函數前加上庫的名字,如:array.new()。通常,程序庫會包含創建對象的方法。如:
LUALIB_ITEM_create("new", MyArray ) // 創建MyArray (註:由於發表的原因,create應為全部大寫)
這樣子,你才能在Lua中創建MyArray:
a = array.new()

你也可以選擇增加一個刪除對象操作:
LUALIB_ITEM_DESTROY("del", MyArray ) // 刪除MyArray
這樣,你就可以直接刪除一個對象了:
array.del(a)

(3) BEGIN_REGLUALIB_MEMBER() …END_REGLUALIB_MEMBER()
在此處,你可以定義對象的成員函數,也可以重載對象的操作符——是的,就象C++的operator重載。例如:
LUALIB_ITEM_FUNC("__newindex", void (MyArray*, int, double), &MyArray::setvalue)
就是重載 operator[] 操作符。Lua中可重載的操作符還有許多,如:

__getindex:操作符[],支持讀取訪問,如 v = a[10]
__newindex:操作符[],支持賦值訪問,如 a[10] = 1.22
__tostring:將變數轉換成字串__add:等同於operator +
__add:操作符 +
__sub:操作符 –
__mul:操作符 ×
__div:操作符 ÷
__pow:操作符 ^ (乘方)
__unm:一元操作符 –
__concat:操作符 .. (字元串連接)
__eq:操作符 == (a ~= b等價於 not a == b)
__lt:操作符 < (a > b 等價於 b < a)
__le:操作符 <= (a >= b 等價於 b <= a,要注意的是,如果沒有定義"__le",則Lua將會嘗試將a<=b 轉換成 not (b < a) )

__gc:在垃圾回收時調用此函數,相當於C++的析構函數。強烈建議定義此操作符,以免造成內存泄漏等情況。比如:
LUALIB_ITEM_DESTROY("__gc", MyArray ) // 垃圾收集時消除對象用。

(注) 這里要說明一下,在lua中,訪問索引操作符是__index,不是__getindex,在luaWrapper庫中,為了方便使用,將其映射為__getindex,同時,對__index的定義將會被忽略。

㈩ Lua腳本怎麼樣調用外部腳本

若要調用外部Lua腳本,需要使用dofile。
這很像C語言中的 #include「」
用法:dofile ("路徑")

==================
--File:E:\lua1.lua
dofile ("Hello.lua")

print(a)
==================
--File: E:\Hello.lua
a = 100
==================
==輸出==
100