Для начала, я знаю об этом вопросе, но я не думаю, что он вполне соответствует тому, что я делаю. В любом случае, ответ немного сбивает с толку мое мнение. Я хотел бы найти ответ для своей проблемы, более конкретно относящийся к тому, что я делаю.
Цель для файла lua chatterToolsTest
состоит в том, чтобы успешно вывести «Test success» на консоль. К сожалению, мой нынешний подход не совсем работает. Может кто-нибудь, пожалуйста, помогите? Я не лучший в 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/
:
И, наконец, вот класс тестирования Java, использующий LuaJ, который вызывает их:
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)
Любая помощь или ссылки на соответствующие ресурсы приветствуются.