luaj can't import my app's classes: vm error: java.lang.ClassNotFoundException

luaj can't import my app's classes: vm error: java.lang.ClassNotFoundException

当尝试从我的应用程序导入任何 class 时,luaj(3.0-beta2) 抛出异常,在导入内置 classes 时找不到 class ,不存在这个问题

代码运行函数

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;
        }

    }

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

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

class 导入为“firebase”并不重要,我需要通过 createProxy 从这个 class 获取接口,但问题是一样的

更新:

找到我的麻烦的原因。新版本的 luaj 使用不同的 classloader,它看不到我的应用程序 classes 的内部

引自网站: 在较新的版本中,如果在 Java 系统库中找不到 class,LuaJ 似乎会检查本地应用程序目录。因为桌面项目是一个 运行nable *.jar 并且包含实际的 class 文件,所以桌面版本的游戏在任何版本的 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 运行ner


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;
        }

新错误screenshot

我必须下载库并手动添加它才能编辑这一行。这很有帮助,我不再需要 class 修复程序:

LuaJavaLib.java:202

原版returnClass.forName(名称,真实,ClassLoader.getSystemClassLoader());

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