Aracılığıyla paylaş


Java Kitaplığını Bağlama

Android topluluğu, uygulamanızda kullanmak isteyebileceğiniz birçok Java kitaplığına sahiptir; Bu kılavuzda, Bağlama kitaplığı oluşturarak Java kitaplıklarını Xamarin.Android uygulamanıza nasıl ekleyeceksiniz açıklanmaktadır.

Genel bakış

Android için üçüncü taraf kitaplık ekosistemi çok büyük. Bu nedenle, var olan bir Android kitaplığını kullanmak, yeni bir kitaplık oluşturmaktan daha mantıklıdır. Xamarin.Android, bu kitaplıkları kullanmanın iki yolunu sunar:

  • C# çağrıları aracılığıyla Java kodunu çağırabilmeniz için kitaplığı otomatik olarak C# sarmalayıcılarıyla sarmalayan bir Bağlamalar Kitaplığı oluşturun.

  • Java kitaplık kodunda çağrıları doğrudan çağırmak için Java Yerel Arabirimi'ni (JNI) kullanın. JNI, Java kodunun yerel uygulamalar veya kitaplıklar tarafından çağrılmaya ve çağrılmaya olanak tanıyan bir programlama çerçevesidir.

Bu kılavuzda ilk seçenek açıklanmaktadır: Bir veya daha fazla mevcut Java kitaplığını uygulamanızda bağlanabileceğiniz bir derlemeye sarmalayan 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ılabilen Sarmalayıcılar (MCW) kullanarak bağlamalar uygular. MCW, yönetilen kodun Java kodunu çağırması gerektiğinde kullanılan bir JNI köprüsüdür. Yönetilen çağrılabilen sarmalayıcılar, Java türlerini alt sınıflama 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ğinde, bunu Android Çağrılabilir Sarmalayıcılar (ACW) olarak bilinen başka bir JNI köprüsü aracılığıyla yapar. Bu mimari aşağıdaki diyagramda gösterilmiştir:

Android JNI bridge architecture

Bağlamalar Kitaplığı, Java türleri için Yönetilen Çağrılabilen Sarmalayıcılar içeren bir derlemedir. Örneğin, bağlama kitaplığında sarmalamak istediğimiz bir Java türü MyClassaşağıda verilmiştir:

package com.xamarin.mycode;

public class MyClass
{
    public String myMethod (int i) { ... }
}

içeren MyClass.jar için bağlama kitaplığı oluşturduktan sonra örneği oluşturabilir ve C# dilinden yöntemleri çağırabiliriz:

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. Ayrıca, Android Arşivi için Bağlama Kitaplıkları ( oluşturabilirsiniz. AAR) dosyaları ve Eclipse Android Kitaplığı projeleri. Sonuçta elde edilen Bağlamalar Kitaplığı DLL derlemesine başvurarak, Xamarin.Android projenizde mevcut bir Java kitaplığını yeniden kullanabilirsiniz.

Bağlama Kitaplığınızdaki türlere başvururken, bağlama kitaplığınızın ad alanını kullanmanız gerekir. Genellikle, C# kaynak dosyalarınızın en üstüne Java paket adının .NET ad alanı sürümü olan bir using yönerge eklersiniz. Örneğin, bağlı .jar java paketi adı aşağıdaki gibiyse:

com.company.package

Ardından, ilişkili .jar dosyasındaki türlere erişmek için C# kaynak dosyalarınızın en üstüne aşağıdaki using deyimi koyarsınız:

using Com.Company.Package;

Mevcut bir Android kitaplığını bağlarken aşağıdaki noktaları göz önünde bulundurmak gerekir:

  • Kitaplık için dış bağımlılıklar var mı? – Android kitaplığı için gereken tüm Java bağımlılıkları, Xamarin.Android projesine ReferenceJar veya EmbeddedReferenceJar olarak eklenmelidir. Bağlama projesine tüm yerel derlemeler EmbeddedNativeLibrary olarak eklenmelidir.

  • Android kitaplığı, Android API'sinin hangi sürümünü hedeflemektedir? – Android API düzeyini "düşürmek" mümkün değildir; Xamarin.Android bağlama projesinin Android kitaplığıyla aynı API düzeyini (veya üstünü) hedeflediğinden emin olun.

  • 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 oluşturulduysa bağlama hataları oluşabilir. Mümkünse, Xamarin.Android yüklemeniz tarafından kullanılan JDK'nin aynı sürümünü kullanarak Android kitaplığını yeniden derleyin.

Derleme Eylemleri

Bağlama kitaplığı oluşturduğunuzda, .jar veya üzerinde derleme eylemleri ayarlarsınız. Bağlama kitaplığı projenize eklediğiniz AAR dosyaları – her derleme eylemi, veya .jar belirler. AAR dosyası Bağlamalar Kitaplığınıza eklenir (veya bu dosyaya başvuruda bulunur). Aşağıdaki listede bu derleme eylemleri özetlemektedir:

  • EmbeddedJar– .jar, sonuçta elde edilen Bağlamalar Kitaplığı DLL'sine eklenmiş bir kaynak olarak ekler. Bu en basit ve en yaygın kullanılan derleme eylemidir. .jar otomatik olarak bayt koduna derlenip Bağlamalar Kitaplığı'na paketlenmiş olmasını istediğinizde bu seçeneği kullanın.

  • InputJar– .jar sonuçta elde edilen Bağlamalar Kitaplığı .DLL eklemez. Bağlama Kitaplığı .DLL çalışma zamanında bu .jar bağımlılığı olacaktır. bağlama kitaplığınıza .jar eklemek istemediğinizde (örneğin, lisanslama nedenleriyle) bu seçeneği kullanın. Bu seçeneği kullanırsanız, uygulamanızı çalıştıran cihazda giriş .jar kullanılabilir olduğundan emin olmanız gerekir.

  • LibraryProjectZip – Bir ekler. AAR dosyasını sonuçta elde edilen Bağlamalar Kitaplığı .DLL. Bu, bağlı içindeki kaynaklara (ve koda) erişebilmeniz dışında EmbeddedJar'a benzer. AAR dosyası. Eklemek istediğinizde bu seçeneği kullanın. Bağlamalar Kitaplığınıza AAR ekleyin.

  • ReferenceJar– Başvuru .jar belirtir: başvuru .jar, bağlı.jar veya .jar. AAR dosyaları bağlıdır. Bu başvuru .jar yalnızca derleme zamanı bağımlılıklarını karşılamak için kullanılır. Bu derleme eylemini kullandığınızda, başvuru .jar için C# bağlamaları oluşturulmaz ve sonuçta elde edilen Bağlamalar Kitaplığı .DLL eklenmez. Başvuru .jar için bağlama kitaplığı oluşturacak ancak henüz yapmadıysanız 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.

  • EmbeddedReferenceJar– Sonuçta elde edilen Bağlamalar Kitaplığı .DLL bir başvuru .jar ekler. Hem giriş .jar (veya) için C# bağlamaları oluşturmak istediğinizde bu derleme eylemini kullanın. AAR) ve tüm başvuru .jar Bağlamalar Kitaplığınızda.

  • EmbeddedNativeLibrary – Bağlamaya yerel bir .so ekler. Bu derleme eylemi, bağlı olan .jar dosyasının gerektirdiği .so dosyaları için kullanılır. 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 bunları 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 FOOBAR-javadoc**.jar**) uyan bir Java kitaplığı için Javadoc arşiv Jar'sine işaret etmek için kullanılır.
  • JavaDocIndex , API başvuru belgeleri HTML'sinde dosyaya işaret etmek için index.html kullanılır.
  • JavaSourceJar, ilk olarak kaynaklardan JavaDoc oluşturmak ve ardından Maven paket stiline uyan bir Java kitaplığı için sonuçları olarak JavaDocIndexişlemek için kullanılır JavaDocJar(genellikle FOOBAR-sources**.jar**).

API belgeleri Java8, Java7 veya Java6 SDK'sından (hepsi farklı biçimde) veya DroidDoc stilindeki 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 .so kitaplığı eklemek gerekebilir. Sarmalanan Java kodu yürütürken, Xamarin.Android JNI çağrısını yapamaz ve java.lang.UnsatisfiedLinkError: Native yöntemi bulunamadı: uygulama için logcat out içinde görüntülenir.

Bunun düzeltmesi, .so kitaplığını çağrısıyla el ile yüklemektirJava.Lang.JavaSystem.LoadLibrary. Örneğin, bir Xamarin.Android projesinin embeddedNativeLibrary derleme eylemiyle bağlama projesine dahil libpocketsphinx_jni.o nedenle paylaşılan kitaplığı olduğunu varsayarsak, aşağıdaki kod parçacığı (paylaşılan kitaplığı kullanmadan ö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 listede Java'nın C#/.NET ile nasıl eşlendiği açıklanmaktadır:

  • Java'daki Setter/Getter yöntemleri .NET'teki Özellikler'dir.

  • Java'daki alanlar .NET'teki Özellikler'dir.

  • Java'daki Dinleyiciler/Dinleyici Arabirimleri .NET'teki Olaylardır. Geri çağırma arabirimlerindeki yöntemlerin parametreleri bir EventArgs alt sınıfla temsil edilir.

  • Java'daki Statik İç İçe Geçmiş sınıf, .NET'te iç içe geçmiş bir sınıftır.

  • Java'daki inner sınıfı, C# dilinde örnek oluşturucuya sahip 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 üzere 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şturmaya yönelik bir kılavuzdur.

  • Bağlama. AAR , için Bağlama Kitaplıkları oluşturmaya yönelik bir kılavuzdur. AAR dosyaları. Android Studio kitaplıklarını bağlamayı öğrenmek için bu kılavuzu okuyun.

  • Eclipse Kitaplık Projesi bağlama, 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 kılavuzu okuyun.

  • Bağlamaları Özelleştirme, derleme hatalarını çözmek için bağlamada el ile değişiklikler yapmayı ve sonuçta elde edilen API'yi daha "C#benzeri" olacak şekilde şekillendirmeyi açıklar.

  • Bağlama sorunlarını giderme yaygın bağlama hata senaryolarını listeler, olası nedenleri açıklar ve bu hataları çözmeye yönelik öneriler sunar.