Hi!
Here is a working example. I used the rhino jar from the ASE-
reporsitory (placed in libs).
Best regards, Micke
package miki.jsapp;
import android.app.Activity;
import android.os.Bundle;
import android.widget.*;
import org.mozilla.javascript.*;
public class JSApp extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
TextView view = new TextView(this);
view.setText("Hello JavaScript!");
setContentView(view);
doit(view,
"var x = 'Kalle\\nLisa';\n" +
"TheView.append(x);"
);
}
void doit(TextView view, String code)
{
// Creates and enters a Context. The Context stores
information
// about the execution environment of a script.
Context cx = Context.enter();
cx.setOptimizationLevel(-1);
try
{
// Initialize the standard objects (Object, Function,
etc.)
// This must be done before scripts can be executed.
Returns
// a scope object that we use in later calls.
Scriptable scope = cx.initStandardObjects();
ScriptableObject.putProperty(scope, "TheView",
Context.javaToJS(view, scope));
// Now evaluate the string we've colected.
Object result = cx.evaluateString(scope, code, "doit:", 1,
null);
// Convert the result to a string and print it.
view.append(Context.toString(result));
}
finally
{
// Exit from the context.
Context.exit();
}
}
}
On Oct 15, 2:10 am, "Nolan Darilek" <[email protected]> wrote:
> Hi, all, hoping someone can give me a few pointers as to what I'm doing
> wrong.
>
> I'm trying to embed Rhino in my Android app to add scripting
> functionality. According to Google, the Rhino shell works fine on
> Android, which I've confirmed by building and running it from source
> under Donut. So unless I'm comparing apples and orangutangs, my use case
> should work too.
>
> First I tried the basic embedding examples from the documentation,
> though I called cx.setOptimization(-1) to disable all compilation. No
> luck. I then thought that perhaps something was being optimized in the
> context before I could turn off optimization, so I created my own
> ContextFactory, and set the optimization level in the onContextCreated()
> method, but no luck. Here's my current Scala code for creating an
> interpreter and evaling an empty string for now:
>
> package info.thewordnerd.spiel.scripting
>
> import org.mozilla.javascript.Context
> import org.mozilla.javascript.ContextFactory
> import org.mozilla.javascript.Scriptable
>
> class MyContextFactory extends ContextFactory {
> override protected def onContextCreated(cx:Context) {
> cx.setOptimizationLevel(-1)
> }
>
> }
>
> object Scripter {
>
> val js = """
> """
>
> def apply() = {
> ContextFactory.initGlobal(new MyContextFactory)
> val cx = Context.enter
> cx.setOptimizationLevel(-1)
> val scope = cx.initStandardObjects
> val result = cx.evaluateString(scope, js, "<spiel>", 1, null)
> Context.exit
> true
> }
>
> }
>
> Running this on the emulator gives the following error (line 20 in
> scripts.scala is the Context.enter call):
>
> E/AndroidRuntime( 771): Uncaught handler: thread main exiting due to
> uncaught exception
> E/AndroidRuntime( 771): java.lang.ExceptionInInitializerError
> E/AndroidRuntime( 771): at
> org.mozilla.javascript.Context.enter(Context.java:411)
> E/AndroidRuntime( 771): at
> org.mozilla.javascript.Context.enter(Context.java:406)
> E/AndroidRuntime( 771): at
> org.mozilla.javascript.Context.enter(Context.java:386)
> E/AndroidRuntime( 771): at
> info.thewordnerd.spiel.scripting.Scripter$.apply(scripting.scala:20)
> E/AndroidRuntime( 771): at
> info.thewordnerd.spiel.services.Spiel.onServiceConnected(Spiel.scala:28)
> E/AndroidRuntime( 771): at
> android.accessibilityservice.AccessibilityService$IEventListenerWrapper.executeMessage(AccessibilityService.java:222)
>
> E/AndroidRuntime( 771): at
> com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:45)
>
> E/AndroidRuntime( 771): at
> android.os.Handler.dispatchMessage(Handler.java:99)
> E/AndroidRuntime( 771): at android.os.Looper.loop(Looper.java:123)
> E/AndroidRuntime( 771): at
> android.app.ActivityThread.main(ActivityThread.java:4203)
> E/AndroidRuntime( 771): at
> java.lang.reflect.Method.invokeNative(Native Method)
> E/AndroidRuntime( 771): at
> java.lang.reflect.Method.invoke(Method.java:521)
> E/AndroidRuntime( 771): at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
>
> E/AndroidRuntime( 771): at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
> E/AndroidRuntime( 771): at dalvik.system.NativeStart.main(Native
> Method)
> E/AndroidRuntime( 771): Caused by: java.lang.IllegalStateException:
> Failed to create VMBridge instance
> E/AndroidRuntime( 771): at
> org.mozilla.javascript.VMBridge.makeInstance(VMBridge.java:69)
> E/AndroidRuntime( 771): at
> org.mozilla.javascript.VMBridge.<clinit>(VMBridge.java:49)
> E/AndroidRuntime( 771): ... 15 more
>
> So what am I missing that lets the shell, compiled on a very similar
> toolchain, work just fine? Is there some setup step I'm missing?
>
> Thanks.
_______________________________________________
dev-tech-js-engine-rhino mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-js-engine-rhino