Author: nguyendinhquang.it

  • Binding library android -Xamarin Android

    Kết quả hình ảnh cho binding android xamarin

    Với một vài dự án khách hàng đã code sẵn cho 1 cái library android rồi, và họ sẽ gửi cho bạn sử dụng cái lib đó. Hoặc là bạn có 1 cái lib rất ngon trên android. Nhưng muốn dùng trong project Xamarin của bạn mà không muốn code lại logic của nó. Như vậy bạn cần binding nó vào project của bạn và chỉ việc dùng không cần code lại 1 tí logic nào.

    I. Input:
    Project dự án code bằng ngôn ngữ Xamarin
    Các file android libraries .aar (Android Archive Library)
    Bản chất của file này là file .zip gồm
    – Compiled Java code
    – Resource Ids (File R)
    – Resources
    – Meta-data (for example, Activity declarations, permissions)

    II. Output
    Project Xamarin có thể gọi và sử dụng được class chứa trong file .aar

    III.Guideline
    1. Tạo 1 project binding với 1 file .aar cơ bản
    1) Add new project Binding library(Android)
    2) Add file .aar vào folder Jar
    3) Set build action cho .AAR file là LibraryProjectZip
    4) Chọn target framework cho project lib nếu cần
    5) Build Bindings Library.
    Sau khi tạo xong và build thành công chúng ta sẽ add file đó vào project Xamarin của chúng ta muốn sử dụng.
    Vậy là chúng ta có thể call tới class chứa trong file .aar.
    Mình chỉ nói các bước thực hiện thôi, chi tiết các bạn nên tham khảo tại : https://docs.microsoft.com/en-us/xamarin/android/platform/binding-java-library/binding-an-aar

    Như ở trên là cách tạo và add 1 project binding library với file source code trong file aar là đơn giản.
    Với những file .aar phức tạp và chúng có link đến nhau thì sao ?

    2. Tạo project binding nâng cao
    1. Đầu tiên các bạn vẫn phải thực hiện các bước như trên. Vì xamarin có 1 nhược điểm là 1 file aar bắt buộc bạn cần phải tạo ra 1 project binding
    2. Cần phải xác định file aar nào sử dụng file aar nào.
    Ví dụ chúng ta có 2 file aar, file thứ nhất call đến 1 class trong file thứ 2
    Như vậy làm thế nào để biết được file nào dùng đến file nào
    – Bạn cần 1 tool để decode java trong file aar (Android studio chẳng hạn)
    – Sau đó bạn mở những class trong file aar ra. Xem phần import của chúng sử dụng những class nào có chứa trong file aar khác không
    – Đôi khi trong file aar nó sẽ sử dụng dependence đến 1 lib nào mà k chứa trong tất cả file aar của bạn. Thì bạn cần xem nó là những lib nào.
    Click chuột phải vào Packages của Project đó chọn Add packages. Rồi tìm xem tên lib đó có trong nuget không.
    Nếu không có, thì bạn có thể tìm và tải file jar của lib ấy về rồi copy vào folder Jar. Build action bạn để là EmbeddedJar
    Bạn thử build xem còn lỗi gì không.
    Nếu còn lỗi. Bạn cần phải customizing binding.
    3.Customizing Binding
    Với android chúng ta chỉ cần customize lại file Metadata.xml Transform File.
    Trong file Metadata.xml thì sẽ có 3 element :
    – add-node
    – attr
    – remove-node

    Mình cũng làm 1 vài project liên quan đến binding library. Và cũng customize file metadata.xml này, mình thấy như sau

    khi thấy error bạn chọn vào 1 item error

    Bạn có thể nhìn thấy dòng // Metadata.xml Xpath classs ….
    hãy coppy từ chỗ path=”…”
    Bạn có thể sử dụng remove-node trong file metadata.xml với lỗi ”do not exist in the namespace …’
    Thực ra bạn remove node này nó không ảnh hưởng gì đến code trong project cả. Việc generate class java sang c# ở đây chỉ là Android.Runtime.Register thôi.
    chứ không phải là nó generate all source code của cả class java sang c# .

    Một số trường hợp bạn không nhìn thấy class mình dùng được generate ra
    Trường hợp này chúng ta sẽ add bằng tay dùng add-node
    Ví dụ :

    <add-node path="/api/package[@name='your package name']">	
            <class abstract="false" deprecated="not deprecated" extends="java.lang.Object" 	
                extends-generic-aware="java.lang.Object" final="false" name=" your class name" static="true" visibility="public">	
            </class>	
    </add-node>	

    Một số trường hợp khác như tên classs trùng nhau, rồi đổi visibility của class … thì bạn dùng thằng att để thay đổi attribute của nó.
    Về chi tiết các bạn có thể tham khảo tại : https://docs.microsoft.com/en-us/xamarin/android/platform/binding-java-library/customizing-bindings/java-bindings-metadata
    Một vài lưu ý nữa là kể cả việc file aar bị mã hoá cũng không ảnh hưởng gì đến việc binding nhé. Vì những class a, b, c trong đó bạn trả bao giờ dùng đến cả.

    Bài viết của mình xin hết, nếu bạn nào dùng mà cảm thấy không hiểu thì contact với mình.

    Nếu các bạn cần binding với xamarin ios xem tại: https://magz.techover.io/2019/12/30/binding-objective-c-libraries-xamarin-ios/

    Thanks you!

  • Binding Objective-C libraries – Xamarin iOS

    Binding Objective-C libraries – Xamarin iOS

    Content

    1. Create project Objective-C lib
    2. Define functions
    3. Config project
    4. Create makefile
    5. Create project binding library in solution Xamarin
    6. Add binding library to project iOS Xamarin
    7. Call Library API trong code Xamarin.

    1. Create project objective-C

    Open Xcode, File -> New project -> Cocoa Touch Static Library> Next

    Tiếp theo, nhập tên project, phần language nhớ chọn Objective-C nhé

    2. Define functions

    Define các functions vào file .m(implement) và file .h (header) phần logic các bạn tự code nhé @@

    3. Config project

    Setting target version sang iOS mà bên Xamarin các bạn sẽ chọn, ở đây project của mình để là 10.0

    4. Run terminal commands

    4.1 Create 1 makefile

    Với content như dưới đây, chú ý thay chỗ in đậm bằng tên của project

    XBUILD=/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild
    PROJECT_ROOT=./TênProject
    PROJECT=$(PROJECT_ROOT)/ TênProject.xcodeproj
    TARGET= TênProject

    all: lib$(TARGET).a

    lib$(TARGET)-i386.a:
    $(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphonesimulator -configuration Release clean build
    -mv $(PROJECT_ROOT)/build/Release-iphonesimulator/lib$(TARGET).a $@

    lib$(TARGET)-armv7.a:
    $(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch armv7 -configuration Release clean build
    -mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@

    lib$(TARGET)-arm64.a:
    $(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch arm64 -configuration Release clean build
    -mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@

    lib$(TARGET).a: lib$(TARGET)-i386.a lib$(TARGET)-armv7.a lib$(TARGET)-arm64.a
    xcrun -sdk iphoneos lipo -create -output $@ $^

    clean:
    -rm -f *.a *.dll

    4.2 Execute makefile

    Vào terminal đi đến folder chứa Makefile gõ:
    •“make” – để chạy makefile
    •“make clean” – để clean các file thư viện .a được generate ra sau khi đã chạy ”make” ( Hàm này để đỡ phải xoá file .a = tay thôi)

    4.3 The API definition file

    Sau khi đã có file .a, chạy lệnh sau:

    sharpie bind -sdk iphoneos12.4 /Users/apple/Documents/UrlFilterLib2/UrlFilterLib2/*.h -scope /Users/apple/Documents/UrlFilterLib2/UrlFilterLib2/

    Chú ý đường dẫn vào library mỗi máy khác nhau, và cái số ”12.4” là hỗ trợ iOS version mới nhất của Xcode,
    • Ex :  Xcode 10.3 có hỗ trợ iOS mới nhất là 12.4
    • Sau khi chạy lệnh trên, sẽ generate ra file ApiDefinition.cs

    Đến đây là chúng ta đã hoàn thành bước tạo library rồi đó. Tiếp theo là sử dụng nó trong project Xamarin nhé .

    5. Add binding library to project Xamarin

    1. Click chuột phải vào Solution ->  Add ->  Add new project

    2. Chọn iOS -> Library -> Bindings Library.

    3. Next.

    4. Kéo file .a vào binding library project vừa tạo

    5. Alert hiện lên, chọn “Copy the file in the directory”  -> OK
    Copy content trong file ApiDefinition.cs tại step 4  vào file ApiDefinition.cs trong project  Xamarin này.

    6. Sau đó nhấn chọn build Library project.

    6. Add binding library to project Xamarin

    1. Click chuột phải vào “References”, chọn “Edit references”.
    2. Tích chọn Library project..
    3. OK

    7. Call library API

    Sau khi thực hiện các bước ở trên chúng ta có thể gọi chúng như với các lib của Xamarin rồi

    Kết Luận

    Như vậy là chúng ta đã hoàn thành việc binding lib từ objective-c vào Xamarin iOS. Phần tiếp theo mình sẽ hướng dẫn binding với android.
    Tham khảo tại: https://docs.microsoft.com/en-us/xamarin/cross-platform/macios/binding/?context=xamarin/ios