此处的目标是使lua文件chatterToolsTest
成功地将“测试成功”打印到控制台。不幸的是,我目前的方法还行不通。有人可以帮忙吗?我不是Lua的佼佼者,所以在这种情况下,也许我的Lua代码是错误的。请查看下面的代码段。
另一个约束:我无法从Java端启用模块。必须仅通过Lua获得在两个Lua文件之间进行的任何引用。这是因为我正在开发Java项目的改装系统,并且需要Lua能够在Java方面进行最少的改动。
请记住,我没有将Lua文件存储在JAR文件或任何包中,它们包含在Java程序根工作目录的文件夹中,例如资源文件夹。
chatterToolsTest.lua
:
function main()
print("Test start.");
local test = require("chatterTools");
chatterTools:test();
end
chatterTools.lua
,由chatterToolsTest.lua
调用的类:
function test()
print("Test success");
end
这两个文件都位于名为world/NOKORIWARE/lua/
的文件夹中:
最后,这是使用LuaJ调用它们的Java测试类:
public class LuaTest {
public static void main(String args[]) {
new LuaTest().run("NOKORIWARE/lua/chatterToolsTest.lua", "main");
}
private Globals buildGlobals() {
Globals globals = new Globals();
globals.load(new JseBaseLib());
globals.load(new PackageLib());
globals.load(new Bit32Lib());
globals.load(new TableLib());
globals.load(new StringLib());
globals.load(new JseMathLib());
globals.load(new WhitelistedLuajavaLib());
LoadState.install(globals);
LuaC.install(globals);
return globals;
}
/**
* Runs the given lua file. It must be relative to the lua path.
*/
private void run(String luaPath, String functionName, Object... arguments) {
LuaValue[] coercedValues = null;
if (arguments != null) {
//Coerce arguments into LuaValues
coercedValues = new LuaValue[arguments.length];
for (int i = 0; i < arguments.length; i++) {
coercedValues[i] = CoerceJavaToLua.coerce(arguments[i]);
}
}
//Configure lua file
Globals globals = buildGlobals();
globals.get("dofile").call(LuaValue.valueOf("./world/" + luaPath));
//Call the passed-in function of the lua file.
try {
LuaValue call = globals.get(functionName);
if (arguments != null) {
call.invoke(coercedValues);
}else {
call.invoke();
}
} catch (Exception e) {
e.printStackTrace();
TinyFileDialog.showMessageDialog("Caught " + e.getClass().getName(), e.getMessage(), TinyFileDialog.Icon.INFORMATION);
}
}
}
这是我运行Java程序时打印的错误:
org.luaj.vm2.LuaError: @./world/NOKORIWARE/lua/chatterToolsTest.lua:4 module 'chatterTools' not found: chatterTools
no field package.preload['chatterTools']
chatterTools.lua
no class 'chatterTools'
at org.luaj.vm2.LuaValue.error(Unknown Source)
at org.luaj.vm2.lib.PackageLib$require.call(Unknown Source)
at org.luaj.vm2.LuaClosure.execute(Unknown Source)
at org.luaj.vm2.LuaClosure.onInvoke(Unknown Source)
at org.luaj.vm2.LuaClosure.invoke(Unknown Source)
at org.luaj.vm2.LuaValue.invoke(Unknown Source)
at nokori.robotfarm.test.LuaTest.run(LuaTest.java:64)
at nokori.robotfarm.test.LuaTest.main(LuaTest.java:21)
感谢任何帮助或指向相关资源的链接。
答案 0 :(得分:0)
默认的LuaJ工作目录与Java相同。一旦知道了这一点,便可以正确使用require()
。
chatterTools.lua
更改为此:
local chatterTools = {}
function chatterTools.test()
print("Test success");
end
return chatterTools;
最后chatterToolsTest.lua
必须像这样更改:
function main()
print(package.path);
local chatterTools = require("world.NOKORIWARE.lua.chatterTools");
chatterTools:test();
end
Lua处理上述包,因此它变成了world/NOKORIWARE/lua/chatterTools.lua
调用中看到的内容,而不是require()
。
这些更改之后,我运行了程序并获得了以下内容:
?.lua
Test success
考虑到所有这些问题,该解决方案比我在本问题开始时链接的问题的答案更为直接。希望这会对您中的某些人有所帮助。
要了解有关如何解决此问题的更多信息,请查看以下资源:
how to call function between 2 .lua
https://forums.coronalabs.com/topic/38127-how-to-call-a-function-from-another-lua-file/