2014-04-08 3 views
9

Es gibt mehrere Möglichkeiten, dass Andorid aka-nativen Code (Java-Code) in Xamarin-Projekt integriert werden konnte. Offizielle Wege sind in this article aufgeführt..jar android Bibliothek importieren in Xamarin Projekt

Wir versuchen, einen Java Library Binding-Ansatz zu verwenden, der im Artikel beschrieben wird. für diese Frage speziell.

Wir haben es in Android Developer Tools erstellt und es als Java Android Library eingestellt. Es wird in Eclipse in ein .jar-Format eingebaut, das auf der Xamarin-Site als ausreichend angesehen wird. Wenn wir versuchen, .jar in unser Projekt in Visual Studio zu binden, zeigt der Object Explorer uns den Namespace der Bindungsassembly an, aber im Code können wir, obwohl die Assembly referenziert ist, nicht auf die Methoden und Klassen zugreifen im namespace deklariert in unserem test java android lib ..

Auf der anderen Seite, wenn wir fast alle .jar nehmen, die eine Android-Bibliothek im Internet ist (zum Beispiel this one), können wir es binden und zugreifen es ist Methoden ohne ein Problem.

Bitte vergleichen Sie zwei .jar und wenn möglich, lassen Sie mich wissen, was ist falsch mit unserem Test android-Bibliothek auf Github, die unser Namespace aus dem Code nicht verfügbar sein.

+0

Benötigen Sie eine "Android-Bibliothek" oder nur eine normale Bibliothek? Ihr Beispiel-Jar ist keine Android-Bibliothek, es ist eine Standart-Java-Bibliothek, die eine Menge kompilierter Klassen enthält. Unterschied in hier ist Android-Bibliothek enthält Ressourcen, nicht nur Java-Code zu teilen. Da dein Beispiel Test.java nichts über Android hat, kannst du es einfach kompilieren und kritzeln. –

+0

Wenn Sie * .jar in * .zip umbenennen, können Sie jedes Archiv-Tool verwenden, um nach innen zu schauen. Ich weiß nicht über Android-Anforderungen, aber Ihre GitHub..bin/a2dp.jar enthält META-INF/MAINFEST.MF mit 2 Bytes nichts, so dass es aussieht wie ein Compiler-Problem, bitte bieten Sie echte Jar – xmojmr

Antwort

3

las ich die gleichen Binding a Java Library Artikel, den Sie die Anweisungen taten, ging durch, und hatte keine Fehler zu bauen. Als ich versuchte, die Klassen aus meiner JAR-Datei zu verwenden, erkannte Intellisense nichts. Dann lese ich den Folgeartikel auf API Metadata Reference. Das brachte mich auf den Gedanken, dass ich vielleicht versuchen sollte, die Datei Transforms/Metadata.xml zu bearbeiten. Nach der kurzen Bearbeitung, um das Paket umzubenennen, erlaubte Visual Studio (nach einem Kompilieren) einen Verweis auf eine Klasse aus der JAR-Datei. Ich habe dann versucht, eine Methode von der Klasse aufzurufen, und wieder einen weiteren Compilerfehler. Also ging ich zurück in die Datei Metadata.xml und fügte einen Eintrag hinzu, um die betreffende Methode umzubenennen. Ich habe meinen Code bearbeitet, um die umbenannte Methode aufzurufen, und Visual Studio wurde ordnungsgemäß kompiliert. Ich habe diesen Anruf in einen Unit-Test-Fall integriert, und er hat bestanden!

Aus meiner Lesung schien es nicht notwendig, die Datei Metadata.xml zu bearbeiten, aber zumindest nach meiner Erfahrung schien es notwendig. Es verwendet XPATH für die Datei obj/Release/api.xml (wie in API Metadata Reference angegeben). Aus diesem Artikel gab es Beispiele für die Umbenennung der beiden Methoden & Methodennamen, so dass es nicht viel Arbeit für mich war, in meine Metadata.xml-Datei einzufügen. Außerdem habe ich das OsmBindingDroidExample aus dem Artikel Binding a Java Library heruntergeladen und auch die Datei Metadata.xml ausgecheckt.

Hier ist meine XML-Referenz auch:

<metadata> 
    <attr path="/api/package[@name='com.abc.def']" name="managedName">MyRenamedPackage</attr> 
    <attr path="/api/package[@name='com.abc.def']/class[@name='MyClass']/method[@name='originalJavaMethod']" name="managedName">RenamedDotNetMethod</attr> 
</metadata> 

So, jetzt in meinem .NET-Code, könnte ich schreiben:

MyRenamedPackage.MyClass.RenamedDotNetMethod(...); 

hoffte, das hilft!

EDIT:

ich ein wenig vertrauter mit dem Xamarin Toolkit bekommen haben, und ein Update haben, um diesen zu erleichtern verwenden.

Um die Beteiligung von Code zu minimieren, der mit den jar-Methoden interagieren muss, können Sie mit Xamarin C# -Klassen im Ordner Additions erstellen.Also habe ich eine Wrapperklasse erstellt, die die Methoden in einer verwalteten C# -Klasse verfügbar macht, auf die andere Projekte zugreifen können. Da es C# ist, gibt es keine Beschwerden von Visual Studio.

Hier ist, was eine Wrapper-Klasse wie das Gehen mit meinem früheren Beispiel aussehen würde (natürlich werden Sie einen Namen sinnvoller auf die Aufgabe in der Hand holen):

public class InovcationWrapper 
{ 
    public static void InvokeMethod(...) 
    { 
     MyRenamedPackage.MyClass.RenamedDotNetMethod(...); 
    } 
} 

Dann in Ihrem Projektcode, würden Sie hat die volle IntelliSense, wenn Sie nur Ihre Wrapper-Klasse nennen:

InvocationWrapper.InvokeMethod(...); 

Dies es viel einfacher macht, mit zu arbeiten und begrenzt die Menge des roten Kringel im Code ignoriert werden. Hoffe das hilft!