2010-10-04 37 views
17

我正在嘗試在Android的Java應用程序中使用Mozilla Rhino來評估一些JavaScript。我正在使用Eclipse + ADT插件。在Android上使用Rhino的問題

首先,我嘗試從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) { 
      // ... 
     } 

我還發現this blog post包含類似的代碼,並說有用。作者說他使用了一個來自Android Scripting網站的jar文件。我在那裏發現的唯一jar文件在rhino_extras_r3.zip。但是,它不包含.class文件,而是包含classes.dex文件。當我在Eclipse中將它添加爲庫時,它不能識別它包含的類,因此無法編譯我的項目,因爲缺少對Rhino類的引用。

任何有關如何讓這個工作的幫助,感激不盡!

回答

32

我終於搞定了。我應該更密切地關注我鏈接的博客文章。

如果我添加行

cx.setOptimizationLevel(-1); 

禁用的優化,一切完美的作品。

+12

默認情況下,Rhino會嘗試生成JVM字節碼,作爲一種Javascript JIT。這很酷,但是Android不運行JVM字節碼 - 它運行Dalvik字節碼。因此,您必須通過您顯示的代碼片段來禁用優化,以允許Rhino運行。 – CommonsWare 2010-10-04 22:06:48

+0

我確認這有助於:-) – agibalov 2012-07-24 10:33:11

+1

@仍然面對同樣的問題後添加此行.. – 2012-10-27 12:39:10

11

在版本控制系統的SL4A網站上提供了兼容Android版本rhino1_7R2.jarHere is a sample project將Rhino和BeanShell封裝到Android解釋器服務中。

+0

謝謝,我沒有注意到,jar文件,因爲它不是在下載部分列出。它仍然沒有解決我的問題(我已經發布了我的實際解決方案),但是你絕對應該得到一個向上看,它向我展示了jar文件的位置以及我可以用作示例的示例項目。 – 2010-10-04 22:06:19

+1

以下是直接鏈接:http://code.google。com/p/android-scripting/source/browse/rhino/rhino1_7R2.jar – 2012-04-05 07:38:30

1

我寫了一個庫,允許在Android上運行Rhino。

優點包括:

  • 犀牛隻能在優化級別-1運行。該庫支持所有級別。
  • 該庫支持使用JavaAdapter,這對於基準Rhino來說是不可能的。
  • 雖然我沒有對此進行基準測試,但它應該會提高性能。 (編譯代碼比解釋代碼快)

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

相關問題