尝试从我的应用程序中导入任何类时,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;
}
新错误截图