2010-10-04 49 views
17

Tôi đang cố gắng sử dụng Mozilla Rhino trong ứng dụng Java của mình cho Android để đánh giá một số JavaScript. Tôi đang sử dụng Eclipse + ADT plugin.Các sự cố khi sử dụng Rhino trên Android

Trước tiên, tôi đã thử tải xuống tệp Rhino .jar từ trang web của Mozilla và thêm nó vào dự án dưới dạng thư viện trong Eclipse. Eclipse nhận ra nó tốt và biên dịch ứng dụng. Tuy nhiên, khi chạy nó tôi nhận được một ngoại lệ khi gọi Context.evaluateReader() (xem dưới đây để theo dõi ngăn xếp). Sau đó, tôi đã thử thêm mã nguồn Rhino như là một dự án Android riêng biệt trong Eclipse, đánh dấu nó như một thư viện và tham chiếu nó trong dự án của tôi, đủ để có được Eclipse để biên dịch nó, nhưng dẫn đến lỗi tương tự .

Đây là stacktrace tôi nhận được (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 

Các bit của mã của tôi mà lượt truy cập ngoại trừ trông như thế này:

 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) { 
      // ... 
     } 

Tôi cũng thấy this blog post mà chứa mã tương tự và nói nó hoạt động. Tác giả nói rằng ông đã sử dụng một tệp jar từ trang web Android Scripting. Tệp jar duy nhất tôi tìm thấy có trong số rhino_extras_r3.zip. Tuy nhiên, tệp không chứa các tệp .class nhưng thay vì tệp classes.dex. Khi tôi thêm điều này như là một thư viện trong Eclipse, nó không nhận ra các lớp chứa nó và do đó không thể biên dịch dự án của tôi vì các tham chiếu bị thiếu trong các lớp Rhino.

Bất kỳ trợ giúp nào về cách làm việc này được đánh giá cao!

Trả lời

32

Cuối cùng tôi đã làm việc đó. Tôi nên chú ý hơn đến bài đăng trên blog mà tôi đã liên kết.

Nếu tôi thêm dòng

cx.setOptimizationLevel(-1); 

để vô hiệu hóa optimisations, mọi thứ hoạt động hoàn hảo.

+12

Theo mặc định, Rhino cố gắng tạo JVM bytecode khi đang bay, như là một loại Javascript JIT. Đó là điều tuyệt vời và tất cả, nhưng Android không chạy bytecode JVM - nó chạy Dalvik bytecode. Do đó, bạn phải vô hiệu hóa tối ưu hóa, thông qua đoạn mã bạn đã cho thấy, để cho phép Rhino chạy. – CommonsWare

+0

Tôi xác nhận điều này sẽ giúp :-) – agibalov

+1

@Listill m gặp vấn đề tương tự sau khi thêm dòng này .. –

11

Ấn bản tương thích với Android rhino1_7R2.jar có sẵn trên trang web SL4A, trong hệ thống kiểm soát phiên bản. Here is a sample project kết thúc tốt đẹp Rhino và BeanShell thành một dịch vụ thông dịch viên Android.

+0

Cảm ơn, tôi đã không nhận thấy rằng tập tin jar vì nó không được liệt kê trong phần tải. Nó vẫn không giải quyết được vấn đề của tôi (tôi đã đăng giải pháp thực tế của tôi), nhưng bạn chắc chắn xứng đáng nhận được đề xuất cho tôi xem tệp jar là gì và dự án mẫu mà tôi có thể sử dụng làm ví dụ. –

+1

Đây là liên kết trực tiếp: http://code.google.com/p/android-scripting/source/browse/rhino/rhino1_7R2.jar –

1

Tôi đã viết thư viện cho phép chạy Rhino trên Android.

Ưu điểm bao gồm:

  • tê giác chỉ có thể chạy trên mức độ tối ưu hóa -1. Thư viện hỗ trợ tất cả các cấp.
  • Thư viện hỗ trợ việc sử dụng JavaAdapter, điều này là không thể với Rhino cơ sở.
  • Tôi không đạt được điểm chuẩn này, nên tăng hiệu suất. (Mã Biên soạn là nhanh hơn so với mã giải thích)

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

Các vấn đề liên quan