J'ai créé une activité assez simple Mono pour le projet Android:Comment appeler Mono pour Android dans l'application Android?
[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;
}
}
L'activité ne doit servir de preuve de concept, d'où sa simplicité. Maintenant, j'aimerais pouvoir appeler la méthode GetString() à partir de l'application Android «normale» basée sur Java.
En Xamarin's docs, j'ai lu à propos de Java to Managed interop, qui semble être exactement ce que je recherche. Si je comprends bien, lorsque l'application Mono pour Android compile, elle génère des classes Java appelées Android Callable Wrappers (ACW). Je devrais alors être en mesure d'appeler des méthodes sur ces ACW à partir de l'application Android basée sur Java. La question est: comment puis-je faire référence à Mono compilé pour l'application Android (le fichier apk) à partir de l'application Android basée sur Java?
C'est où je suis maintenant bloqué et n'a pas pu trouver des exemples concrets. Il y a des questions similaires ici sur SO (this one et this one) et quelques blogposts, mais ils se résument simplement à "utiliser des ACW". Mais comment exactement? Peut-être qu'il me manque quelque chose d'évident ici, n'étant aucun type Android.
Ce que j'ai essayé est de charger dynamiquement le fichier dex que je tirai de mon Mono pour Android apk. Je l'ai simplement mis sur la carte de stockage, puis j'ai essayé d'utiliser DexClassLoader
de l'application Android basée sur Java pour le charger (j'ai suivi ce blog post). La classe ACW a été trouvé, mais quand j'essayé de créer son exemple, j'obtenu l'erreur suivante:
No implementation found for native Lmno/android/Runtime;.register (Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;)
Je suppose que je dois inclure une certaine façon Mono pour l'exécution Android à l'application Java, mais je aucune idée comment.
EDIT: Ceci est le code que je suis en train de charger le dex avec:
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: Je lis maintenant here qu'il devrait être possible de démarrer directement les activités écrit en Mono pour Android à partir de Java. Il n'est toujours pas clair pour moi comment référencer le Mono pour Android à partir de Java et Google ne donne aucun résultat pertinent. Vraiment perplexe maintenant.
Merci beaucoup pour votre réponse, enfin quelque chose à travailler avec! Qu'est-ce que vous dites a beaucoup de sens, mais quel est le but de ces documents Xamarin liés dans ma question? Quand est-ce que j'utiliserais l'ACW et l'attribut 'Export'? Et peut-être le plus important, est-ce qu'il y a une façon de faire de l'application Java "parler" à Mono pour Android sans avoir à installer deux applications séparées, par exemple avoir une bibliothèque Mono pour Android et simplement le référencer depuis l'application Java? Je serais vraiment reconnaissant si vous pouviez clarifier cela un peu pour moi. –