2011-06-28 6 views
1

私はMonoDroidを使用しており、WebViewからC#コードを呼び出し可能にしたいと考えています。MonoDroidでwebView.AddJavascriptInterfaceを使用する

JavaScriptで
protected override void OnCreate(Bundle bundle) 
{ 
     [...] 
     LinearLayout layout = FindViewById<LinearLayout>(Resource.Id.MyLayout); 
     var webView = new WebView(this); 
     webView.SetWebChromeClient(new WebChromeClient()); 
     webView.Settings.JavaScriptEnabled = true; 
     webView.AddJavascriptInterface(new JSAccesibleObject(), "cSharpObject"); 
     webView.LoadUrl("file:///android_asset/test.html"); 
     layout.AddView(webView); 
} 

public class JSAccesibleObject : Java.Lang.Object 
{ 
     public void method1() 
     { 

     } 
} 

、cSharpObjectが定義されているが、それはプロパティがありません:

私はこの(C#)をやっています。

alert(cSharpObject); //[email protected] 
for (var prop in cSharpObject) 
    alert(prop); //this never gets called 
alert(cSharpObject.method1) //undefined 
alert(cSharpObject.method1()) //fails 

私が何か間違ったことをやっている、またはこれは単にMonoDroidでは動作しませんか?

答えて

1

A)メソッドに[エクスポート]属性を追加します。 xamarianウェブサイト上

B): http://docs.xamarin.com/android/recipes/Controls/WebView/Call_C%23_from_JavaScript

C)アクションをビルドし、Activity1.OnCreateで()、.javaファイルであなたのJavaScriptInterfaceタイプを書くAndroidJavaSourceと、プロジェクト内の.java ファイルを含めます、do:

IntPtr JavaScriptInterface_Class = JNIEnv.FindClass ("the/package/for/JavaScriptInterface"); 
// TODO: Update "the/package/for" as appropriate for your type. 
IntPtr JavaScriptInterface_ctor = JNIEnv.GetMethodID (JavaScriptInterface_Class, "<init>", "()V"); 
IntPtr instance = JNIEnv.NewObject (JavaScriptInterface_Class, JavaScriptInterface_ctor); 

appView.AddJavascriptInterface (new Java.Lang.Object (instance), "Android"); 
+0

ここで、Javaオブジェクトのインスタンス化に関する情報を入手しましたか?実際には「新しいJSAccesibleObject()」を実行するだけで十分です。彼が見逃していたのは、メソッドの[Export]属性だけでした... –

0

JSAccesibleObjectクラス用に生成されるJavaブリッジコードを調べることができます。 \ obj \ Debug \ android \ srcを見てそこにどのようなメソッド/プロパティがあるのか​​を見てください。これらは、Javaから呼び出し可能なメソッドでなければなりません。

関連する問題