2010-11-20 31 views
1

當試圖在Android 2.2上使用Rhino 1.7 r2將對象添加到JS環境時,我總是得到一個NullPointerException。爲了得到這個例外,我已經把課程簡化到最低限度,我找不出原因。下面是總是產生異常的代碼:更改麻煩行一些其他像insertObj = Context.javaToJS(null, mScope);還是真的什麼,但this並不會出現問題在Android上嵌入Rhino問題

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); 
    } 
} 

這裏是堆棧跟蹤:

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 

任何有識之士,爲什麼發生這種情況,將不勝感激。

[編輯]一些嚴重的google搜索和頭部砸後,我發現了ScriptableObject.defineClass方法,並試圖使用替代,繼犀牛文檔中的例子,但現在我得到一個RuntimeException「的ReferenceError:‘設備接口’沒有定義「。我知道這是可能的,因爲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); 
    } 
} 

而且設備接口類:

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); 
    } 
} 

回答

2

我已經試過您的兩個例子:

  • 你的第一個例子在我的項目中執行時沒有任何異常(在帶有ADK插件的Eclipse下的調試模式下) - 您是如何嵌入Rhin的o圖書館?我已經滿足於「配置構建路徑... /添加外部JAR ...」
  • 你的第二個示例在標準JVM上拋出相同的異常 - 這意味着它不是Android問題。
+2

我用相同的方式將Rhino添加到項目中,使用Eclipse我添加了一個外部JAR ......我不相信它,現在它可以工作。那是什麼意思? 「在別人試用之前,它一直都是壞的。」 – 2010-11-20 21:13:47

+0

你從哪裏下載了罐子?我也有Android上的犀牛問題.. – bhekman 2012-06-21 00:50:29

+0

沒關係。我認爲這個源代碼是兼容的:http://code.google.com/p/android-scripting/source/browse/rhino/rhino1_7R2.jar – bhekman 2012-06-21 01:04:52