我目前正在使用LibGDX框架用Java编写一个游戏引擎。几个月以来,我已经成功地在我的引擎中使用了LuaJ 3.0。让脚本在Android (在两个设备上进行测试)或桌面(进出Eclipse)上运行没有问题。
然而,当我今天尝试部署到Android时,我得到了以下错误:
org.luaj.vm2.LuaError: script:2 vm error: java.lang.ClassNotFoundException: com.javamon.console.ScriptPlayerCreate导致此错误的脚本行是:
Result = luajava.bindClass("com.javamon.console.ScriptPlayerCreate")这与在Android上被认为“找不到”类在排版上是一样的。
如果我试图绑定一个常规的java类,比如java.lang.ClassNotFoundException,我不会遇到任何错误。但是,这个错误不会发生在桌面版本的上,无论是从内部运行还是通过可运行的*.jar运行。
下面是从LogCat检索的堆栈跟踪:
org.luaj.vm2.LuaError: script:2 vm error: java.lang.ClassNotFoundException: com.javamon.console.ScriptPlayerCreate
at org.luaj.vm2.lib.jse.LuajavaLib.invoke(Unknown Source)
at org.luaj.vm2.lib.VarArgFunction.call(Unknown Source)
at org.luaj.vm2.LuaClosure.execute(Unknown Source)
at org.luaj.vm2.LuaClosure.call(Unknown Source)
at com.javamon.console.Script.runFunction(Script.java:91)
at com.javamon.console.Script.runFunction(Script.java:96)
at com.javamon.console.ScriptPlayerCreate.run(ScriptPlayerCreate.java:39)困扰我的是最后一行。ScriptPlayerCreate确实存在--它正在运行产生错误的脚本!
我尝试过的事物:
com.javamon包中绑定不同的类(同样的问题)classes.dex - ScriptPlayerCreate当然在那里我想重申,我已经成功地使用了LuaJ与安卓几个月来,没有意外。此外,自从上一次(成功)部署Android之后,我还没有改变我的脚本引擎。
更新
在尝试恢复到我的应用程序和Eclipse的备份版本之后,问题依然存在--甚至在另一台计算机上也是如此。我开始怀疑luajava.bindClass() 不知道如何解释 classes.dex,的内容,而是在搜索实际的类文件。
当我试图重新编译一些备份版本时,我注意到重新编译的版本几乎总是有一个比备份更小的classes.dex文件。也许是出了什么问题,还是Eclipse/Android的编译器发生了变化?
我尝试手动将类文件插入APK中的com/javamon/控制台/文件夹,但这当然会破坏文件的完整性,即使在重新签名应用程序之后也不会加载。有什么想法吗?
发布于 2014-04-14 01:23:12
恢复到LuaJ 2.0.1解决了这个问题。
看来,2.0.1以上的所有LuaJ版本都有不同的LuajavaLib.class实现。在新的实现中,只有Java库可以通过luajava.bindClass()访问,而在旧版本中,bindClass()也允许访问本地应用程序类。所有其他脚本函数都正常运行;只影响.。
在新版本中,如果在Java库中找不到类,LuaJ显然会检查本地应用程序目录。因为桌面项目是一个可运行的*.jar,并且包含实际的class文件,所以桌面版本的游戏在LuaJ的任何版本中都会正常工作。相比之下,Android将所有内容都捆绑在一个classes.dex文件中,这在文件路径意义上并不是“可搜索的”。因此出现了ClassNotFoundException。
最后:我已经成功地使用LuaJ几个月了,那么什么改变了呢?显然,当我几个月前升级到3.0时,Eclipse从未真正识别出文件更改。直到我刷新和清理项目时,Eclipse才意识到出现了一个新版本的LuaJ。因为LibGDX中的主要项目仅是源文件(资产在-android中),所以您几乎从不单击“刷新”。因此,LuaJ问题成了一种定时炸弹.
我计划向作者提交一张支持票,以便他能够解决这个问题。在他这么做之前,我建议安卓开发人员继续使用LuaJ 2.0.1!
发布于 2014-10-13 10:15:31
我也遇到了类似的问题,我会解决的
LuaJavaLib.java:202
原始返回Class.forName(名称,真,Class.forName)
更改为返回Class.forName(名称、真、Class.forName)
发布于 2015-04-15 10:35:49
此外,您还可以使用您的类助手修复它。
Create :这个包中的org.luaj.vm2.lib.jse创建以下类:
package org.luaj.vm2.lib.jse;
public class Helper {
public static JavaClass forClass(Class c) {
return JavaClass.forClass(c);
}
public Class<JavaClass> huskClass() {
return JavaClass.class;
}
}然后创建类似于桥接类的内容:
public class LuaBridge {
public Varargs getClass(String clazzName) {
try {
Class clazz = Class.forName(clazzName);
return Helper.forClass(clazz);
} catch (Exception e) {
e.printStackTrace();
Crashlytics.logException(e);
}
return null;
}
}现在,当您运行脚本时,可以将实例传递给lua脚本:
_globals = JsePlatform.standardGlobals();
_bridge = new LuaBridge();
//...
_globals.loadfile(scriptName)
.call(CoerceJavaToLua.coerce(_bridge));在你的LUA脚本中:
第一行:
local luaBridge = ...
-- some code here...
UserManager = luaBridge:getClass("com.dexode.cree.ScriptPlayerCreate")
-- used like luajava.bindClass("com.dexode.cree.ScriptPlayerCreate")https://stackoverflow.com/questions/23025835
复制相似问题