ho letto lo stesso Binding a Java Library articolo che hai fatto, ha attraversato le istruzioni, e non ha avuto errori di generazione. Quando ho tentato di utilizzare le classi dal mio file jar, intellisense non riconosceva nulla. Poi ho letto l'articolo successivo su API Metadata Reference. Questo mi ha fatto pensare che forse dovrei provare a modificare il file Transforms/Metadata.xml. Dopo aver editato brevemente per includere un rinominare il pacchetto, Visual Studio ha permesso (dopo una compilazione) un riferimento ad una classe dal file jar. Ho quindi provato a chiamare un metodo dalla classe e, di nuovo, ho ricevuto un altro errore del compilatore. Quindi, sono tornato nel file Metadata.xml e ho aggiunto una voce per rinominare il metodo in questione. Ho modificato il mio codice per chiamare il metodo rinominato e Visual Studio ha compilato correttamente. Ho integrato questa chiamata in un caso di test unitario, e è passata!
Dalla mia lettura, non sembrava necessario modificare il file Metadata.xml, ma almeno nella mia esperienza sembrava necessario. Usa XPATH nel file obj/Release/api.xml (come indicato in API Metadata Reference). Da quell'articolo c'erano degli esempi per rinominare entrambi i nomi dei metodi del pacchetto &, quindi non c'era molto lavoro da inserire nel mio file Metadata.xml. Inoltre, ho scaricato OsmBindingDroidExample dall'articolo Binding a Java Library e ho estratto anche il loro file Metadata.xml.
Ecco la mia XML per riferimento così:
<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>
Così, ora nel mio codice .NET, potrei scrivere:
MyRenamedPackage.MyClass.RenamedDotNetMethod(...);
Spero che questo aiuti!
EDIT:
ho ottenuto un po 'più familiarità con il toolkit Xamarin, e hanno un aggiornamento per rendere l'utilizzo questo più facile.
Per limitare il coinvolgimento del codice che deve interagire con i metodi jar, Xamarin consente di creare classi C# nella cartella Additions.Così, ho creato una classe wrapper che espone i metodi in una classe C# gestita a cui altri progetti possono accedere. Dal momento che è C# non ci sono lamentele da parte di Visual Studio.
Ecco cosa una classe wrapper apparirebbe come andare con il mio esempio precedente (ovviamente devi scegliere un nome più significativo al compito a portata di mano):
public class InovcationWrapper
{
public static void InvokeMethod(...)
{
MyRenamedPackage.MyClass.RenamedDotNetMethod(...);
}
}
Poi nel codice del progetto, si sarebbe avere piena intellisense se si chiama il vostro classe wrapper:
InvocationWrapper.InvokeMethod(...);
Questo rende molto più facile da lavorare e limita la quantità di scarabocchi rossi di essere ignorato nel codice. Spero che questo ti aiuti!
Hai bisogno di una "Libreria Android" o di una normale libreria? Il tuo jar di esempio non è una libreria di Android, è una libreria Java standard che contiene un gruppo di classi compilate '. Differenza qui è la libreria Android contiene risorse per condividere non solo il codice java. Dal momento che il tuo esempio Test.java non ha nulla su Android, puoi semplicemente compilarlo e bloccarlo. –
Quando si rinomina * .jar in * .zip è possibile utilizzare qualsiasi strumento di archivio per guardare all'interno. Non conosco i requisiti Android ma il tuo GitHub..bin/a2dp.jar contiene META-INF/MAINFEST.MF con 2 byte di nulla, quindi sembra un problema con il compilatore, si prega di fornire un vero barattolo – xmojmr