12/08/2018, 14:48

[Xamarin Android] Sử dụng thư viện native trong Xamarin Android P.1

Như chúng ta đã biết, Android là một nền tảng có thể thiên biến vạn hoá rất nhiều thứ, nếu chưa nắm được làm những việc đó như thế nào, thì chúng ta đã có những developer có tâm đi trước chúng ta tạo ra những thư viện cho Android để giúp ta làm việc biến hoá đó dễ dàng hơn. Nhưng, những thư viện đó ...

Như chúng ta đã biết, Android là một nền tảng có thể thiên biến vạn hoá rất nhiều thứ, nếu chưa nắm được làm những việc đó như thế nào, thì chúng ta đã có những developer có tâm đi trước chúng ta tạo ra những thư viện cho Android để giúp ta làm việc biến hoá đó dễ dàng hơn. Nhưng, những thư viện đó thường sẽ được viết bằng Java hoặc C++, và cái đáng nói ở đây chính là làm sao để port những thư viện đó vào trong project Xamarin Android của bạn - trong khi Xamarin được chạy trên ngôn ngữ hoàn toàn khác - C#.

Xamarin có hai cách để port những thư viện native vào nó:

  • Sử dụng Java Native Interface (JNI) để gọi thẳng vào code Java trong thư viện.
  • Dùng Bindings Library để tự động wraps thư viện Java bằng code C# và chúng ta có thể sử dụng thư viện như là code C#.

Ở bài này viết mình sẽ viết về những gì mình hiểu về cách 2, cách mình hay dùng nhất.

Giải thích một chút về cách mà xamarin làm thế nào mà chuyển được code Java thành code C# một cách thần thánh như vậy.

Xamarin Android implement binding bằng cách sử dụng Managed Callable Wrappers (MCW). MCW là 1 JNI bridge dùng để managed code (ở đây là C#) có thể gọi đến Java code, ngoài ra nó còn có overriding các virtual method của lib Java... Tương tự thì khi code Android runtime muốn gọi ngược lên managed code, sẽ có 1 bridge tương đương đó là Android Callable Wrappers (ACW). Cơ chế trên nôm na được mô tả như diagram sau:

Giả sử ở 1 class nằm trong 1 thư viện .Jar nào đấy, có code như sau:

package xamarin.viblo.asia.ltquang;

public class Person {
        public String makeSomeBug() { ... }
}

Sau khi được biến hoá bằng múa lửa bằng Bindings Library, chúng ta có thể gọi và sử dụng class trên C# như sau:

...
var bugMaker = new Person();
var productToRelease = bugMaker.MakeSomeBug();
...

Một style code rất C#.

Mổ xẻ bên trong file assembly - output của Bindings Library, nó sẽ chứa những class MCW, các file JAR và các file resources mà thư viện có trước đó.

Một việc khá hay, đó là Xamarin.Android Bindings library sẽ convert tất cả style code của Java, từ pattern đến naming convention sang style của .NET. Các thứ mà nó có thể chuyển đổi:

Setter/Getter methods -> Properties

Java .NET
Setter/Getter methods Properties
Fields Properties
Fields Properties
Fields Properties
Listeners/Listener Interfaces Events. Paramter trong các hàm callback sẽ được chuyển thành các subclass của EventArgs, tương tự callback trong C#.
Static nested class Nested class
Inner class Nest class

Vì điều này nên khi bỗng dưng code trong thư viện java mà bạn tự viết bỗng biến thành style C#, hay các accessor method quen thuộc của java bỗng chốc thu bé lại thành dạng property thì sẽ không phải ngạc nhiên nữa. Cũng như package name như ví dụ trên là:

 package xamarin.viblo.asia.ltquang

Sẽ được chuyển thành

using Xamarin.Viblo.Asia.Ltquang

Trên đây là sơ bộ những điều cơ bản về Xamarin.Android Binding Library mà mình hiểu được. Bài sau sẽ là cách làm thế nào để binding các thư viện .Jar, .AAR hay sử dụng thư viện native (như C++) và các vấn đề cần lưy ý khi sử dụng Bindings Library.

Bài viết có tham khảo tài liệu từ nguồn: https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/ Q.

0