首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LuaJ和Android:无法绑定类

LuaJ和Android:无法绑定类
EN

Stack Overflow用户
提问于 2014-04-12 03:39:38
回答 3查看 1.5K关注 0票数 2

我目前正在使用LibGDX框架用Java编写一个游戏引擎。几个月以来,我已经成功地在我的引擎中使用了LuaJ 3.0。让脚本在Android (在两个设备上进行测试)或桌面(进出Eclipse)上运行没有问题。

然而,当我今天尝试部署到Android时,我得到了以下错误:

代码语言:javascript
复制
org.luaj.vm2.LuaError: script:2 vm error: java.lang.ClassNotFoundException: com.javamon.console.ScriptPlayerCreate

导致此错误的脚本行是:

代码语言:javascript
复制
Result = luajava.bindClass("com.javamon.console.ScriptPlayerCreate")

这与在Android上被认为“找不到”类在排版上是一样的。

如果我试图绑定一个常规的java类,比如java.lang.ClassNotFoundException,我不会遇到任何错误。但是,这个错误不会发生在桌面版本的上,无论是从内部运行还是通过可运行的*.jar运行。

下面是从LogCat检索的堆栈跟踪:

代码语言:javascript
复制
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确实存在--它正在运行产生错误的脚本!

我尝试过的事物:

  • 尝试不同版本的LuaJ
  • com.javamon包中绑定不同的类(同样的问题)
  • 更新我的ADT/SDK插件
  • 清理/重建Eclipse中的项目
  • “重新开始”(使用GUI工具创建一个新的LibGDX项目,并手动导入我的源文件)
  • 检查classes.dex - ScriptPlayerCreate当然在那里
  • 在不同的Android设备上进行测试(Moto X和难以置信的2)

我想重申,我已经成功地使用了LuaJ与安卓几个月来,没有意外。此外,自从上一次(成功)部署Android之后,我还没有改变我的脚本引擎。

更新

在尝试恢复到我的应用程序和Eclipse的备份版本之后,问题依然存在--甚至在另一台计算机上也是如此。我开始怀疑luajava.bindClass() 不知道如何解释 classes.dex,的内容,而是在搜索实际的类文件。

当我试图重新编译一些备份版本时,我注意到重新编译的版本几乎总是有一个比备份更小的classes.dex文件。也许是出了什么问题,还是Eclipse/Android的编译器发生了变化?

我尝试手动将类文件插入APK中的com/javamon/控制台/文件夹,但这当然会破坏文件的完整性,即使在重新签名应用程序之后也不会加载。有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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!

票数 2
EN

Stack Overflow用户

发布于 2014-10-13 10:15:31

我也遇到了类似的问题,我会解决的

LuaJavaLib.java:202

原始返回Class.forName(名称,真,Class.forName)

更改为返回Class.forName(名称、真、Class.forName)

票数 6
EN

Stack Overflow用户

发布于 2015-04-15 10:35:49

此外,您还可以使用您的类助手修复它。

Create :这个包中的org.luaj.vm2.lib.jse创建以下类:

代码语言:javascript
复制
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;
    }
}

然后创建类似于桥接类的内容:

代码语言:javascript
复制
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脚本:

代码语言:javascript
复制
_globals = JsePlatform.standardGlobals();
_bridge = new LuaBridge();
//...
    _globals.loadfile(scriptName)
            .call(CoerceJavaToLua.coerce(_bridge));

在你的LUA脚本中:

第一行:

代码语言:javascript
复制
local luaBridge = ...
-- some code here...
UserManager = luaBridge:getClass("com.dexode.cree.ScriptPlayerCreate")
-- used like luajava.bindClass("com.dexode.cree.ScriptPlayerCreate")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23025835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档