Java Kitaplığını Bağlama
Android topluluğu, uygulamanıza kullanmak istediğiniz birçok Java kitaplığına sahip olabilir; Bu kılavuzda Bir Bağlama Kitaplığı oluşturarak Java kitaplıklarını Xamarin.Android uygulamanıza nasıl dahil etmek mümkün hale geldi?
Genel Bakış
Android için üçüncü taraf kitaplık ekosistemi çok büyük. Bu nedenle, var olan bir Android kitaplığını yeni bir kitaplık oluşturmak yerine kullanmak genellikle mantıklıdır. Xamarin.Android, bu kitaplıkları kullanmak için iki yol sunar:
C# çağrıları aracılığıyla Java kodunu çağırabilirsiniz, böylece kitaplığı otomatik olarak C# sarmalayıcıları ile sarmalar bir Bağlama Kitaplığı oluşturun.
Java yerel arabirimini (JNI) kullanarak doğrudan Java kitaplık kodundaki çağrıları çağırabilirsiniz. JNI, Java kodunun yerel uygulamalar veya kitaplıklar tarafından çağrılmalarını ve çağrılmalarını sağlayan bir programlama çerçevesidir.
Bu kılavuzda ilk seçenek açıklandı: Bir veya daha fazla var olan Java kitaplığını uygulamanıza bağlantı kurabilirsiniz bir derlemeye sarmalayıcı bağlama kitaplığı oluşturma. JNI kullanma hakkında daha fazla bilgi için bkz. JNI ile çalışma.
Xamarin.Android, Yönetilen Çağrılabilir Sarmalayıcılar(MCW)kullanarak bağlamalar uygulamaya alır. MCW, yönetilen kodun Java kodunu çağıran bir JNI köprüsüdür. Yönetilen çağrılabilir sarmalayıcılar, Java türlerinin alt sınıflarını ve Java türlerinde sanal yöntemleri geçersiz kılma desteği de sağlar. Benzer şekilde, Android çalışma zamanı (ART) kodu yönetilen kodu çağırmak istediği zaman, Android Çağrılabilir Sarmalayıcılar (ACW) olarak bilinen başka bir JNI köprüsü aracılığıyla bunu yapar. Bu mimari aşağıdaki diyagramda gösterildiği gibi:
Bağlama Kitaplığı, Java türleri için Yönetilen Çağrılabilir Sarmalayıcılar içeren bir derlemedir. Örneğin, bağlama kitaplığında MyClass sarmak istediğiniz java türü şöyledir:
package com.xamarin.mycode;
public class MyClass
{
public String myMethod (int i) { ... }
}
içeren .jar için bağlama kitaplığını oluşturmanın ardından, bunu örneğiyletir ve C# ile bunun üzerinde yöntemler çağırabilirsiniz:
var instance = new MyClass ();
string result = instance.MyMethod (42);
Bu Bağlama kitaplığını oluşturmak için Xamarin.Android Java Bağlamaları Kitaplığı şablonunu kullanırsınız. Sonuçta elde edilen bağlama projesi MCW sınıfları, .jar dosyaları ve içine eklenmiş Android Kitaplığı projeleri için kaynaklar ile bir .NET derlemesi oluşturur. Android Arşivi için Bağlama Kitaplıkları da oluşturabilirsiniz (. AAR) dosyaları ve Eclipse Android Kitaplığı projeleri. Sonuçta elde edilen Bağlamalar Kitaplığı DLL derlemesi'ne başvurarak, Xamarin.Android projenize mevcut bir Java kitaplığını yeniden kullanabilirsiniz.
Bağlama Kitaplığı'nıza türlere başvururken, bağlama kitaplığının ad alanını kullanabilirsiniz. Genellikle, C# kaynak dosyalarınızın en üstüne Java paketi adının .NET ad alanı using sürümü olan bir yönerge eklersiniz. Örneğin, bağlı .jar dosyanız için Java paketi adı aşağıdaki gibi ise:
com.company.package
Ardından, bağlı using .jar dosyasındaki türlere erişmek için C# kaynak dosyalarınızın en üstüne aşağıdaki using
using Com.Company.Package;
Mevcut bir Android kitaplığını bağlarken aşağıdaki noktaları göz şöyle tutmanız gerekir:
Kitaplık için herhangi bir dış bağımlılık var mı? – Android kitaplığı için gerekli olan tüm Java bağımlılıkları Xamarin.Android projesine Reference Olarak veya EmbeddedReference Olarak Ekli Olarak Dahil Edilmeli. Tüm yerel derlemeler bağlama projesine EmbeddedNativeLibrary olarak eklenmiştir.
Android kitaplığı hangi Android API sürümünü hedefledi? – Android API düzeyini "düşürme" mümkün değildir; Xamarin.Android bağlama projesinin Android kitaplığıyla aynı API düzeyini (veya üst düzeyini) hedeflemektedir.
Kitaplığı derlemek için hangi JDK sürümü kullanıldı? – Android kitaplığı, Xamarin.Android tarafından kullanılandan farklı bir JDK sürümüyle inşa edilmişse bağlama hataları oluşabilir. Mümkünse, Xamarin.Android yüklemeniz tarafından kullanılan JDK sürümünü kullanarak Android kitaplığını yeniden derleme.
Derleme Eylemleri
Bağlama kitaplığı ekleyebilirsiniz. Derleme eylemlerini .jar veya üzerinde ayarlayın. Bağlama Kitaplığı projenize dahil etmek üzere AAR dosyaları – her derleme eylemi .jar veya .jar dosyasıyla ilgili karara varıyor. AAR dosyası Bağlamalar Kitaplığınıza katıştırıldı (veya başvurulacak). Aşağıdaki listede bu derleme eylemleri özetlenmiştir:
EmbeddedJar–EmbeddedJarsonuçta elde edilen Bağlamalar Kitaplığı DLL'sine eklenmiş bir kaynak olarak katıştırıyor. Bu, en basit ve en yaygın kullanılan derleme eylemidir. .jar'ın otomatik olarak byte koduna derlenmiş ve Bağlamalar Kitaplığı'nın içinde paketlenmiş olarak yer almalarını istediğiniz zaman bu seçeneği kullanın.InputJar–InputJardosyasını sonuçta elde edilen Bağlamalar Kitaplığı kitaplığına eklemez .DLL. Bağlama Kitaplığı .DLL çalışma zamanında bu .jar'a bağımlı olacaktır. Bağlama kitaplığınıza .jar eklemek istemiyorsanız (örneğin, lisanslama nedeniyle) bu seçeneği kullanın. Bu seçeneği kullanırsanız, .jar girişinin, uygulamanızı çalıştıran cihazda kullanılabilir olduğundan emin olun.LibraryProjectZip– Bir katıştırıyor. Elde edilen Bağlamalar Kitaplığı kitaplığına AAR .DLL. Bu, EmbeddedAlt ile benzerdir, ancak sınırda bulunan kaynaklara (koda da) erişebilirsiniz. AAR dosyası. eklemek istediğiniz zaman bu seçeneği kullanın. Bağlamalar Kitaplığınıza AAR ile bağlanabilirsiniz.ReferenceJar– Bir başvuruReferenceJarbaşvuru .jar, bağlı.jar veya dosyalarından biri olan bir .jar'dır. AAR dosyaları bağlıdır. Bu .jar başvurusu yalnızca derleme zamanı bağımlılıklarını karşılamak için kullanılır. Bu derleme eylemlerini kullanırken, .jar başvurusu için C# bağlamaları oluşturulmaz ve sonuçta elde edilen Bağlama kitaplığına .DLL. .jar başvurusu için bağlama kitaplığını hazırlarken ancak henüz bunu yapmamışken bu seçeneği kullanın. Bu derleme eylemi, birden çok .jar (ve/veya) paketlemek için kullanışlıdır. AAR'ler) birden çok birbirine bağımlı Bağlama Kitaplığına dönüşür.EmbeddedReferenceJar– Sonuçta elde edilen Bağlamalar Kitaplığı kitaplığınaEmbeddedReferenceJarbaşvurusu .DLL. Hem .jar girişi (veya ) için C# bağlamaları oluşturmak istediğinizde bu derleme eylemlerini kullanın. AAR) ve tüm başvuru .jar'larınıBağlamalar Kitaplığı'nıza koyun.EmbeddedNativeLibrary– Bağlamaya yerelEmbeddedNativeLibrarydosyasını katıştırıyor. Bu derleme eylemi için kullanılır, bu nedenle bağlanan .jar dosyası için gereken dosyalar. Java kitaplığından kod yürütmeden önce .so kitaplığını el ile yüklemek gerekebilir. Bu aşağıda açıklanmıştır.
Bu derleme eylemleri aşağıdaki kılavuzlarda daha ayrıntılı olarak açıklanmıştır.
Ayrıca, Java API belgelerini içeri aktarmaya ve C# XML belgelerine dönüştürmeye yardımcı olmak için aşağıdaki derleme eylemleri kullanılır:
JavaDocJar, Maven paket stiline (genellikle ) uygun bir Java kitaplığı için Javadoc arşiv Jar'ına işaret etmek içinFOOBAR-javadoc**.jar**kullanılır.JavaDocIndex, API başvuru belgeleriindex.htmlHTML'si içinde dosyaya işaret etmek için kullanılır.JavaSourceJar, ilk olarak kaynaklardan JavaDoc oluşturmak ve ardından Maven paket stiline (genellikle) uygun bir Java kitaplığı için sonuçları olarak işleyici olarak tamamlamakJavaDocJarJavaDocIndexiçinFOOBAR-sources**.jar**kullanılır.
API belgeleri Java8, Java7 veya Java6 SDK'sı (hepsi farklı biçime sahiptir) veya AndroidDoc stiline ait varsayılan doclet olmalıdır.
Bağlamaya Yerel Kitaplık Ekleme
Java kitaplığını bağlamanın bir parçası olarak Xamarin.Android bağlama projesine bir .so kitaplığı eklemek gerekebilir. Sarmalanmış Java kodu yürütülürken Xamarin.Android, JNI çağrısını gerçekleştiremez ve java.lang.UnsatisfiedLinkError: Native method not found: hata iletisi uygulamanın logcat içinde görünür.
Bunun düzeltmesi, çağrısıyla .so kitaplığını el ile yüklemektir. Örneğin, bir Xamarin.Android projesinin paylaşılan kitaplığı libpocketsphinx_jni.soEmbeddedNativeLibraryderleme eylemiyle dahil olduğu varsayılırsa, aşağıdaki kod parçacığı (paylaşılan kitaplık kullanılarak önce yürütülür) .so kitaplığını yükler:
Java.Lang.JavaSystem.LoadLibrary("pocketsphinx_jni");
Java API'lerini C'ye uyarlama⧣
Xamarin.Android Bağlama Oluşturucu bazı Java deyimlerini ve desenlerini .NET desenlerine karşılık gelecek şekilde değiştirir. Aşağıdaki liste Java'nın C#/.NET ile nasıl eşlenmiş olduğunu açıklar:
Java'da Setter/Getter yöntemleri .NET'te Özellikler'dir.
Java'daki alanlar .NET'te Özellikler'dir.
Java'daki Dinleyiciler/Dinleyici Arabirimleri.NET'te Olaylar'dır. Geri çağırma arabirimlerinde yöntemlerin parametreleri bir alt sınıf tarafından
EventArgstemsil edilen.Java'da Statik İç İçe Geçmiş sınıfı, .NET'te iç içe geçmiş bir sınıftır.
Java'da İç sınıf, C# içinde örnek oluşturucusu olan iç içe geçmiş bir sınıftır.
Bağlama Senaryoları
Aşağıdaki bağlama senaryosu kılavuzları, uygulamanıza dahil etmek için bir Java kitaplığını (veya kitaplıklarını) bağlamanıza yardımcı olabilir:
Bağlama. JAR, .jar dosyaları için Bağlama Kitaplıkları oluşturma adımlarını içerir.
Bağlama. AAR, için Bağlama Kitaplıkları oluşturmaya bir kılavuz sağlar. AAR dosyaları. Veri kitaplıklarını bağlamayı öğrenmek için bu Android Studio okuyun.
Eclipse Kitaplığı Project, Android Kitaplık Projelerinden bağlama kitaplıkları oluşturmaya yönelik bir kılavuzdur. Eclipse Android Kitaplık Projelerini bağlamayı öğrenmek için bu izlenecek yolu okuyun.
Bağlamaları Özelleştirme, derleme hatalarını çözmek ve sonuçta elde edilen API'yi daha çok "C#like" olacak şekilde şekillendirmek için bağlamada el ile değişiklik yapma hakkında bilgi sağlar.
Bağlama sorunlarını giderme, yaygın bağlama hatası senaryolarını listeler, olası nedenleri açıklar ve bu hataları çözmeye yönelik öneriler sunar.
