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());
当尝试从我的应用程序导入任何 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());