我正在尝试在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[]) …Run Code Online (Sandbox Code Playgroud) 我正在开发一个JavaScript组件,负责向服务器发出请求并将结果分派给UI.通过在JavaScript中执行此操作,我可以在多种类型的UI中使用我的组件:Android应用程序,iOS应用程序,桌面应用程序(QT),Web应用程序......
所有这些UI都实例化了一个Web视图,因此当UI加载专用URL(webview.load("file://myfirstWebPage.html"))时,我的组件就会启动.
第一个网页加载所有JavaScript组件,一旦完成,UI就能够向JavaScript组件发出一些请求,这会向服务器发出请求,当它有响应时,它会将其发送回客户端( UI Android,UI iOS ...)
这个架构工作正常,但我想知道是否有另一种方法加载JavaScript组件而不使用每个客户端上的Web视图?
V8引擎可以帮助我吗?
我想为我的Android应用程序添加一些脚本支持.我的应用程序不是基于Web的,它只是一个用Java编写的常见应用程序.
我需要选择脚本语言及其解释器实现来嵌入.至于语言,我更喜欢JavaScript(或更好地说ECMAScript),因为它没有任何与用户交互的内置东西(我的意思是打印smth等),这正是我需要的(我只是想添加一个几个函数和/或对象与我的一些应用程序的逻辑交互).另一个原因是我对Python的经验很少,而且与Ruby,Lua和其他人完全没有关系,而且就我所知,更多的人都熟悉JavaScript.
我的应用程序中的用户脚本预计会非常小,并且不会经常执行,这就是脚本引擎速度无关紧要的原因.重要的主要标准是解释器引擎隐含的额外二进制apk大小.它应该尽可能小.理想情况下,几十公斤左右,在任何情况下都不超过150-200Kb(当然是在ProGuard之后).我不需要完整的语言支持,例如,如果没有正则表达式,我将非常高兴.另一个重要的事情是引擎的内存消耗(但它不那么重要,然后是二进制大小).
我知道(从/sf/answers/838158261/和使用V8 JavaScript引擎来执行没有webview的JS lib)现代Android设备已经拥有v8 JavaScript引擎.但我无法弄清楚,如何使用它(没有在我的应用程序中嵌入副本).根据soulseekah的第一个链接答案,我可以使用ndk链接到libwebcore.so.但是v8有C++,而不是C API,并且所有名称都被破坏了.所以防止链接器找到它们.我设法从源代码编译我自己的v8副本,并通过ndk在我的应用程序中使用它,但结果.so是17Mb(!!!),这远非可接受.
所以我的问题是,如何通过NDK或其他方式使用安装了Android设备的v8(在真正拥有它的设备上)?或者,如果不可能,是否有其他脚本引擎(用于JavaScript或其他语言),满足我的二进制大小要求?或者可能是v8有一些技巧,它可以使它的尺寸更小(可能是以速度为代价或某些语言功能支持)?
android ×2
v8 ×2
android-ndk ×1
embedding ×1
java ×1
javascript ×1
rhino ×1
scripting ×1
webview ×1