0

尝试从我的应用程序中导入任何类时,luaj(3.0-beta2) 会抛出找不到该类的异常,在导入内置类时,不存在此类问题

代码运行函数

public static boolean run(String code){
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PrintStream printStream = new PrintStream(baos, true, "utf-8");
            Globals globals = JsePlatform.standardGlobals();
            globals.set("logger", CoerceJavaToLua.coerce(new DLogger()));
            globals.set("binder", CoerceJavaToLua.coerce(new EventsBinder()));
            globals.set("entry", CoerceJavaToLua.coerce(new EntryPoints()));
            globals.set("file", CoerceJavaToLua.coerce(new DFile()));
            globals.set("luaj", CoerceJavaToLua.coerce(new LuaRunner()));
            globals.set("firebase", CoerceJavaToLua.coerce(new DFirebase()));
            globals.STDOUT = printStream;
            globals.load(code).call();
            String result =new String(baos.toByteArray());
            if(result != "")
            DLogger.log(result,"Luaj");
            printStream.close();
            return true;
        }catch (Exception e){
            DLogger.log("Luaj error excepted!\n "+e.getMessage(), "LuaRunner");
            return false;
        }

    }

我的应用程序中的类层次结构https://i.stack.imgur.com/9jbwi.png

在我的应用程序中调用 classBinder() 函数https://i.stack.imgur.com/trIQj.png

类导入为“firebase”没关系,我需要通过createProxy从这个类中获取接口,但问题是一样的

升级版:

找到了我麻烦的原因。新版本的 luaj 使用了不同的类加载器,它看不到我的应用程序的内部类

来自该站点的引用:在较新的版本中,如果在 Java 系统库中找不到该类,LuaJ 似乎会检查本地应用程序目录。因为桌面项目是一个可运行的 *.jar 并且包含实际的类文件,所以桌面版本的游戏可以在任何版本的 LuaJ 中正确运行。相比之下,Android 将所有内容捆绑在 classes.dex 文件中,这在文件路径的意义上是不可“搜索”的。因此 ClassNotFoundException。

我也找到了一些解决方案,但它引发了不同的错误:

public class LuajFixer extends LuajavaLib {

    public LuajFixer() {
        super();
    }

    @Override
    protected Class classForName(String name) throws ClassNotFoundException{
            return Class.forName(name, true, Thread.currentThread(). getContextClassLoader());

    }
}

和新的 jlua 跑步者


public static boolean run(String code){
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PrintStream printStream = new PrintStream(baos, true, "utf-8");

            Globals globals = JsePlatform.standardGlobals();
            globals.set("logger", CoerceJavaToLua.coerce(new DLogger()));
            globals.set("binder", CoerceJavaToLua.coerce(new EventsBinder()));
            globals.set("entry", CoerceJavaToLua.coerce(new EntryPoints()));
            globals.set("file", CoerceJavaToLua.coerce(new DFile()));
            globals.set("luaj", CoerceJavaToLua.coerce(new LuaRunner()));
            globals.set("firebase", CoerceJavaToLua.coerce(new DFirebase()));
            globals.load(new LuajFixer());
            globals.STDOUT = printStream;

            LoadState.install(globals);
            LuaC.install(globals);
            globals.load(code).call();
            String result =new String(baos.toByteArray());
            if(result != "")
            DLogger.log(result,"Luaj");
            printStream.close();
            return true;
        }catch (Exception e){
            DLogger.log("Luaj error excepted!\n "+e.getMessage(), "LuaRunner");
            return false;
        }

新错误截图

4

1 回答 1

0

我必须下载库并手动添加它,以便我可以编辑这一行。这有帮助,我不再需要类修复程序:

LuaJavaLib.java:202

原始返回 Class.forName(name, true, ClassLoader.getSystemClassLoader());

更改为 return Class.forName(name, true, Thread.currentThread().getContextClassLoader());

于 2022-02-09T09:57:51.927 回答