Встраивание Rhino в задачи Android - PullRequest
1 голос
/ 20 ноября 2010

При попытке добавить объект в среду JS с помощью Rhino 1.7 r2 на Android 2.2 я всегда получаю исключение NullPointerException.Я свел класс к минимуму, чтобы получить это исключение, и я не могу понять, почему.Вот код, который всегда выдает исключение:

public class StartActivity extends Activity
{
    /** Rhino context object */
    private Context mCX;
    /** Rhino script scope object */
    private Scriptable mScope;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        // Create our context and turn off compilation
        mCX = Context.enter();
        mCX.setOptimizationLevel( -1 );

        // Initialize the scope
        mScope = mCX.initStandardObjects();

        Object insertObj;

        // This line always throws the exception.
        insertObj = Context.javaToJS( this, mScope );

        // We never get here
        ScriptableObject.putProperty( mScope, "platform", insertObj );

        setContentView(R.layout.main);
    }
}

Изменение проблемной строки на какую-то еще, например insertObj = Context.javaToJS( null, mScope ); или что-то еще, кроме this, и проблема не возникает.

Вот трассировка стека:

E/AndroidRuntime(  308): FATAL EXCEPTION: main
E/AndroidRuntime(  308): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.me/com.me.StartActivity}: java.lang.NullPointerException
E/AndroidRuntime(  308):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
E/AndroidRuntime(  308):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime(  308):    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime(  308):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime(  308):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  308):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  308):    at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(  308):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  308):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(  308):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(  308):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime(  308):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(  308): Caused by: java.lang.NullPointerException
E/AndroidRuntime(  308):    at org.mozilla.javascript.net.sf.retrotranslator.runtime.impl.MethodDescriptor.getInstance(MethodDescriptor.java:137)
E/AndroidRuntime(  308):    at org.mozilla.javascript.net.sf.retrotranslator.runtime.java.lang.reflect._Constructor.isVarArgs(_Constructor.java:83)
E/AndroidRuntime(  308):    at org.mozilla.javascript.jdk15.VMBridge_jdk15.isVarArgs(VMBridge_jdk15.java:66)
E/AndroidRuntime(  308):    at org.mozilla.javascript.MemberBox.init(MemberBox.java:86)
E/AndroidRuntime(  308):    at org.mozilla.javascript.MemberBox.<init>(MemberBox.java:72)
E/AndroidRuntime(  308):    at org.mozilla.javascript.JavaMembers.reflect(JavaMembers.java:667)
E/AndroidRuntime(  308):    at org.mozilla.javascript.JavaMembers.<init>(JavaMembers.java:76)
E/AndroidRuntime(  308):    at org.mozilla.javascript.JavaMembers.lookupClass(JavaMembers.java:838)
E/AndroidRuntime(  308):    at org.mozilla.javascript.NativeJavaObject.initMembers(NativeJavaObject.java:90)
E/AndroidRuntime(  308):    at org.mozilla.javascript.NativeJavaObject.<init>(NativeJavaObject.java:80)
E/AndroidRuntime(  308):    at org.mozilla.javascript.NativeJavaObject.<init>(NativeJavaObject.java:70)
E/AndroidRuntime(  308):    at org.mozilla.javascript.WrapFactory.wrapAsJavaObject(WrapFactory.java:149)
E/AndroidRuntime(  308):    at org.mozilla.javascript.WrapFactory.wrap(WrapFactory.java:105)
E/AndroidRuntime(  308):    at org.mozilla.javascript.Context.javaToJS(Context.java:1698)
E/AndroidRuntime(  308):    at com.me.android.StartActivity.onCreate(StartActivity.java:34)
E/AndroidRuntime(  308):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(  308):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime(  308):    ... 11 more

Любая информация о том, почему это происходит, будет принята с благодарностью.

[EDIT] Через некоторое времяСерьезный поиск в Google и разбивание головы Я обнаружил метод ScriptableObject.defineClass и попытался использовать его вместо этого, следуя примерам в документации Rhino, однако теперь я получаю исключение RuntimeException "ReferenceError: 'DeviceInterface' не определено".Я знаю, что это возможно, поскольку Rhino - это то, что ASE использует для поддержки JavaScript.

Вот новый код, который выдает исключение RuntimeException:

public class StartActivity extends Activity
{
    /** Rhino context object */
    private Context mCX;
    /** Rhino script scope object */
    private Scriptable mScope;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        // Create our context and turn off compilation
        mCX = Context.enter();
        mCX.setOptimizationLevel( -1 );

        // Initialize the scope
        mScope = mCX.initStandardObjects();

        try{
            ScriptableObject.defineClass( mScope, DeviceInterface.class );
        } catch( Exception e ) {
            Log.e("StartActivity", e.toString());
        }

        // This is the line that throws the exception
        mCX.evaluateString(mScope,
                "var p = new DeviceInterface();", "",
                1, null);

        setContentView(R.layout.main);
    }
}

Икласс DeviceInterface:

public class DeviceInterface extends ScriptableObject
{
    static private final long serialVersionUID = 1L;

    static public void init ( Scriptable scope )
    {
        Log.i( "JSInterface", "Init called" );
    }

    public DeviceInterface()
    {
        logger( "Created new JSInterface Object" );
    }

    @Override
    public String getClassName()
    {
        return "DeviceInterface";
    }

    public void jsFunction_logger( String message )
    {
        logger( message );
    }

    private void logger( String message )
    {
        if( message.contains("[alrt]") )
            Log.e( "JSInterface", message );
        else if( message.contains("[info]") )
            Log.i( "JSInterface", message );
        else
            Log.d( "JSInterface", message );
    }
}

1 Ответ

2 голосов
/ 20 ноября 2010

Я попробовал оба ваших примера:

  • Ваш первый пример выполняется без каких-либо исключений в моем проекте (в режиме отладки в Eclipse с плагином ADK) - как вы встраивали библиотеку Rhino? Я доволен "Настроить путь сборки ... / Добавить внешний JAR ..."
  • Ваш второй пример вызывает то же исключение на стандартной JVM - это означает, что это не проблема Android.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...