我創建了一個相當簡單的活動中爲單聲道Android項目:如何在Android應用程序中爲Android類調用Mono?
[Activity(Label = "AndroidApplication1", MainLauncher = true, Icon = "@drawable/icon")]
public class Activity1 : Activity
{
private string value = "intitial";
[Export]
public string GetString()
{
return value;
}
[Export]
public void SetString(string newValue)
{
value = newValue;
}
}
活動,只應作爲證明的概念,因此它的簡單性。現在,我希望能夠從「普通」的,基於Java的Android應用程序中調用方法GetString()。
在Xamarin's docs,我已經閱讀了關於Java到託管互操作,這似乎正是我正在尋找。如果我的理解正確,當Mono for Android應用程序編譯時,它會生成被稱爲Android Callable Wrappers(ACW)的Java類。然後,我應該可以從基於Java的Android應用程序調用這些ACW上的方法。
問題是,我該如何從基於Java的Android應用程序中引用已編譯的Mono for Android應用程序(apk文件)?
這就是我現在卡住的地方,無法找到任何具體的例子。在SO(this one和this one)和一些博文中也有類似的問題,但他們只是歸結爲「使用ACW」。 但究竟如何?也許我錯過了一些很明顯的東西,不是Android的傢伙。
我已經試過是動態加載DEX文件,我從我的單猛拉爲Android APK 。我只是把它放在存儲卡上,然後嘗試從基於Java的Android應用程序中使用DexClassLoader
加載它(我按照此blog post)。該ACW類被發現,但是當我試圖創建它的實例,我得到了以下錯誤:
No implementation found for native Lmno/android/Runtime;.register (Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;)
我想,我必須以某種方式包括單爲Android運行在基於Java的應用程序,但我有不知道如何。
編輯: 這是我試圖與加載DEX代碼:
DexClassLoader cl = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(),
optimizedDexOutputPath.getAbsolutePath(),
null,
getClassLoader());
try {
Class<?> classActivity1 = cl.loadClass("androidapplication1.Activity1");
// the following line throws the exception
Object a = classActivity1.newInstance();
Method getStringMethod = classActivity1.getMethod("GetString");
Object result = getStringMethod.invoke(angel);
result = null;
} catch (Exception e) {
e.printStackTrace();
}
EDIT2: 現在我讀here,它應該是可以直接啓動活動用Java從Mono for Android中編寫。我還不清楚如何從Java引用Android的Mono,並且Googling不會產生相關的命中。真的難倒了。
非常感謝您的回答,最終能與您合作!你在說什麼很有道理,但是那些Xamarin文檔的目的是什麼呢?我什麼時候可以使用ACW和'Export'屬性?也許最重要的是,是否有任何方法可以使Java應用程序與Mono for Android類「交談」,而無需安裝兩個單獨的應用程序 - 即類似於安裝Mono for Android庫並僅從Java應用程序引用它?如果你能爲我澄清一點,我會很感激。 –