LuaJ(Java Lua库):从Lua文件中的其他文件中调用Lua函数

LuaJ (Java Lua Library): Calling Lua functions in other files from a Lua file

首先,我知道了这个问题,但我认为它不完全适合我的工作。无论哪种方式,答案都使我的观点有些混乱。我想为我的问题找到一个更具体的答案,

此处的目标是使lua文件chatterToolsTest成功地将"测试成功"打印到控制台。不幸的是,我目前的方法还行不通。有人可以帮忙吗?我不是Lua的佼佼者,所以在这种情况下,也许我的Lua代码是错误的。请查看下面的代码片段。

另一个约束:我无法从Java端启用模块。必须仅通过Lua获得两个Lua文件之间进行的任何引用。这是因为我正在为Java项目开发改装系统,并且需要Lua能够在Java方面进行最小的改动。

请记住,我不是将我的Lua文件存储在JAR文件或任何包中,它们包含在Java程序的根工作目录的一个文件夹中,例如资源文件夹。 >

chatterToolsTest.lua

1
2
3
4
5
6
function main()
  print("Test start.");

  local test = require("chatterTools");
  chatterTools:test();
end

chatterTools.lua,由chatterToolsTest.lua

调用的类

1
2
3
function test()
  print("Test success");
end

这两个文件都在名为world/NOKORIWARE/lua/

的文件夹中

> </p>
<p>最后,这是使用LuaJ调用它们的Java测试类:</p>
<div class=

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相同。一旦弄清楚了,就可以正确使用require()

chatterTools.lua更改为此:

1
2
3
4
5
6
7
local chatterTools = {}

function chatterTools.test()
  print("Test success");
end

return chatterTools;

最后必须像这样更改chatterToolsTest.lua

1
2
3
4
5
6
function main()
  print(package.path);

  local chatterTools = require("world.NOKORIWARE.lua.chatterTools");
  chatterTools:test();
end

Lua像上面那样处理程序包,因此它代替了world/NOKORIWARE/lua/chatterTools.lua,变成了您在require()调用中看到的内容。

这些更改之后,我运行了程序并获得了以下内容:

1
2
?.lua
Test success

考虑到所有这些问题,该解决方案比我在本问题开始时链接的问题的答案更为直接。希望这会对您中的某些人有所帮助。

要了解有关如何解决此问题的更多信息,请查看以下资源:

如何在2个.lua之间调用函数

https://forums.coronalabs.com/topic/38127-how-to-call-a-function-from-another-lua-file/