在安卓上使用 Rhino 时遇到的问题

2022-09-02 19:36:44

我试图在我的Java应用程序中使用Mozilla Rhino来评估一些JavaScript。我正在使用Eclipse + ADT插件。

首先,我尝试简单地从Mozilla的网站下载Rhino .jar文件,并将其作为Eclipse中的库添加到项目中。Eclipse识别出它很好,并编译了该应用程序。但是,在运行它时,我在调用时遇到异常(请参阅下面的堆栈跟踪)。Context.evaluateReader()

然后我尝试在Eclipse中将Rhino源代码作为单独的Android项目添加,将其标记为库并在我的项目中引用它,这足以让Eclipse对其进行编译,但导致了相同的错误。

这是我得到的堆栈跟踪(java.lang.UnsupportedOperationException: can't load this type of class file)

Thread [<7> Thread-8] (Suspended (exception UnsupportedOperationException)) 
    DefiningClassLoader(ClassLoader).defineClass(String, byte[], int, int, ProtectionDomain) line: 338  
    DefiningClassLoader.defineClass(String, byte[]) line: 62    
    Codegen.defineClass(Object, Object) line: 159   
    Codegen.createScriptObject(Object, Object) line: 114    
    Context.compileImpl(Scriptable, Reader, String, String, int, Object, boolean, Evaluator, ErrorReporter) line: 2440  
    Context.compileReader(Reader, String, int, Object) line: 1326   
    Context.compileReader(Scriptable, Reader, String, int, Object) line: 1298   
    Context.evaluateReader(Scriptable, Reader, String, int, Object) line: 1137  
    TimetableProcessor.evaluate(InputStream, String, String[]) line: 31 
    TimetableProcessor.processBasicData(InputStream, String) line: 58   
    TimetableProcessor.process(InputStream, String) line: 52    
    TimetableUpdater.update() line: 53  
    Main$1$1.run() line: 22

我的代码中命中异常的部分如下所示:

        Context cx = Context.enter();
        cx.setLanguageVersion(Context.VERSION_1_7);
        Scriptable scope = cx.initStandardObjects();
        try {
            Object result = cx.evaluateReader(scope, new InputStreamReader(data), /* <<< exception here */
                    filename, 0, null);
        } catch (IOException e) {
            // ...
        }

我还发现了这篇博客文章,其中包含类似的代码并说它有效。作者说他使用了Android脚本站点上的jar文件。我在那里找到的唯一一个jar文件是在.但是,它不包含文件,而是文件。当我在Eclipse中将其作为库添加时,它没有识别它包含的类,因此由于缺少对Rhino类的引用而无法编译我的项目。rhino_extras_r3.zip.classclasses.dex

任何关于如何让它工作的帮助都是值得赞赏的!


答案 1

我终于让它工作了。我应该更密切地关注我链接的那篇博客文章。

如果我添加该行

cx.setOptimizationLevel(-1);

禁用优化,一切都完美无缺。


答案 2

与 Android 兼容的版本可在 SL4A 站点的版本控制系统中找到。这是一个示例项目,它将 Rhino 和 BeanShell 打包到 Android 解释器服务中。rhino1_7R2.jar


推荐