LuaJ (Java Lua Library): Calling Lua functions in other files from a Lua file
首先,我知道了这个问题,但我认为它不完全适合我的工作。无论哪种方式,答案都使我的观点有些混乱。我想为我的问题找到一个更具体的答案,
此处的目标是使lua文件
另一个约束:我无法从Java端启用模块。必须仅通过Lua获得两个Lua文件之间进行的任何引用。这是因为我正在为Java项目开发改装系统,并且需要Lua能够在Java方面进行最小的改动。
请记住,我不是将我的Lua文件存储在JAR文件或任何包中,它们包含在Java程序的根工作目录的一个文件夹中,例如资源文件夹。 >
1 2 3 4 5 6 | function main() print("Test start."); local test = require("chatterTools"); chatterTools:test(); end |
调用的类
1 2 3 | function test() print("Test success"); end |
这两个文件都在名为
的文件夹中

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | 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程序时打印的错误:
1 2 3 4 5 6 7 8 9 10 11 12 | 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) |
感谢任何帮助或与相关资源的链接。
默认的LuaJ工作目录与Java相同。一旦弄清楚了,就可以正确使用
1 2 3 4 5 6 7 | local chatterTools = {} function chatterTools.test() print("Test success"); end return chatterTools; |
最后必须像这样更改
1 2 3 4 5 6 | function main() print(package.path); local chatterTools = require("world.NOKORIWARE.lua.chatterTools"); chatterTools:test(); end |
Lua像上面那样处理程序包,因此它代替了
这些更改之后,我运行了程序并获得了以下内容:
1 2 | ?.lua Test success |
考虑到所有这些问题,该解决方案比我在本问题开始时链接的问题的答案更为直接。希望这会对您中的某些人有所帮助。
要了解有关如何解决此问题的更多信息,请查看以下资源:
如何在2个.lua之间调用函数
https://forums.coronalabs.com/topic/38127-how-to-call-a-function-from-another-lua-file/