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!
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
Tôi xác nhận điều này sẽ giúp :-) – agibalov
@Listill m gặp vấn đề tương tự sau khi thêm dòng này .. –