在Android上使用Rhino的问题

时间:2010-10-04 21:33:35

标签: java android rhino

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

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

然后我尝试将Rhino源代码添加为Eclipse中的单独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) {
            // ...
        }

我还发现this blog post包含类似的代码并说它有效。作者说他使用了Android Scripting网站上的jar文件。我在那里找到的唯一jar文件是rhino_extras_r3.zip。但是,它不包含.class个文件,而是包含classes.dex个文件。当我在Eclipse中添加它作为库时,它无法识别它包含的类,因此缺少编译我的项目,因为缺少对Rhino类的引用。

对于如何使其发挥作用的任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:33)

我终于开始工作了。我应该更加关注我链接的博客文章。

如果我添加行

cx.setOptimizationLevel(-1);

禁用优化,一切正常。

答案 1 :(得分:11)

版本控制系统中的SL4A网站上提供了与Android兼容的rhino1_7R2.jar版本。将Rhino和BeanShell包装成Android解释器服务的Here is a sample project

答案 2 :(得分:1)

我写了一个允许在Android上运行Rhino的库。

优点包括:

  • Rhino只能在优化级别-1上运行。该库支持所有级别。
  • 该库支持使用JavaAdapter,这对于基本Rhino来说是不可能的。
  • Altough我没有对此进行基准测试,它应该会提高性能。 (编译代码比解释代码更快)

https://github.com/F43nd1r/rhino-android