我在 Mono for Android 项目中创建了一个相当简单的 Activity:
[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()。
In Xamarin 的文档 http://docs.xamarin.com/android/advanced_topics/Java_Integration,我读过有关 Java 到托管互操作的内容,这似乎正是我正在寻找的内容。如果我理解正确的话,当 Mono for Android 应用程序编译时,它会生成称为 Android Callable Wrappers (ACW) 的 Java 类。然后我应该能够从基于 Java 的 Android 应用程序调用这些 ACW 上的方法。
问题是,我到底如何引用编译好的 Mono for Android 应用程序(apk文件)来自基于 Java 的 Android 应用程序?
这就是我现在陷入困境的地方,无法找到任何具体的例子。这里也有类似的问题(this one https://stackoverflow.com/questions/7279012/how-to-call-a-net-class-from-a-java-class-in-mono-from-android and this one https://stackoverflow.com/questions/7467469/monodroid-interop-betwen-java-and-c-sharp)和一些博文,但它们只是归结为“使用 ACW”。但具体如何呢?也许我在这里遗漏了一些明显的东西,因为我不是 Android 人。
我尝试过的是动态加载dex我从 Mono for Android 中提取的文件apk。我只是将其放在存储卡上,然后尝试使用DexClassLoader
从基于 Java 的 Android 应用程序加载它(我已经遵循了博客文章 http://android-developers.blogspot.sk/2011/07/custom-class-loading-in-dalvik.html)。找到了 ACW 类,但是当我尝试创建它的实例时,出现以下错误:
未找到本机 Lmno/android/Runtime;.register 的实现 (Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;)
我想我必须以某种方式将 Mono for Android 运行时包含到基于 Java 的应用程序中,但我不知道如何实现。
EDIT:这是我试图加载的代码dex with:
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 https://stackoverflow.com/questions/6814478/using-c-sharp-library-with-mono-for-android-from-java-code应该可以从 Java 直接启动 Mono for Android 编写的活动。我仍然不清楚如何从 Java 引用 Mono for Android,并且谷歌搜索没有产生相关的结果。现在真是难住了。