7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Android SDK

Làm quen với Native Development Kit của AndroidÂm thanh Chạy nền trong Android với MediaSessionCompatChụp hình với ứng dụng Android của bạn

Scroll to top
Read Time: 8 mins

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Với việc phát hành Android Studio 2.2, việc phát triển các ứng dụng Android có chứa mã C++ đã trở nên dễ dàng hơn bao giờ hết. Trong bài hướng dẫn này, tôi sẽ hướng dẫn bạn cách sử dụng Android Native Development Kit, thường được biết đến là NDK, để tạo một thư việc gốc C++ mà các hàm của nó sẵn dùng cho các lớp Java.

Các yêu cầu

Để có thể theo dõi bài hướng dẫn này, bạn sẽ cần những thứ sau đây:

  • phiên bản mới nhất của Android Studio
  • một kiến thức cơ bản về cú pháp C++

1. Tại sao viết Native Code (mã gốc)?

Theo thói quen, bạn sẽ phát triển một ứng dụng Android sử chỉ dụng Java. Thêm mã C++ sẽ tăng sự phức tạp của nó lên đáng kể và đồng thời giảm tính linh hoạt của nó. Tuy nhiên, dưới đây là một vài lý do tại sao bạn vẫn nên làm vậy:

  • Để tối ưu hoá hiệu năng: Bạn có thể cải thiện hiệu năng của một ứng dụng Android, cho dù chỉ hơi hơi, bằng cách cài đặt các phần CPU-mạnh của business logic của nó trong C++.
  • Để sử dụng các hàm API hiệu năng cao: Các hàm API như Vulkan GraphicsOpenSL ES là một phần của NDK. Do đó, các nhà phát triển game Android có xu hướng sử dụng NDK.
  • Để sử dụng các thư việc phổ biến của C/C++: Có một số thư việc C và C++ ở bên ngoài mà không có tương ứng cho Java. Nếu bạn muốn làm việc với chúng trong ứng dụng Android của bạn, thì sử dụng NDK là một cách.
  • Để sử dụng lại code: Miễn là nó không chứa bất kỳ phụ thuộc nền tảng riêng biệt nào, thì code được viết trong C++ có thể được sử dụng ở trong cả ứng dụng Android và iOS, thường với ít sự thay đổi. Nếu bạn đang phát triển một ứng dụng lớn và có ý định hỗ trợ cả nền tảng iOS và Android, sử dụng C++ có thể cải thiện hiệu suất của bạn.

2. Tạo một dự án mới

Trong Android Studio 2.2 hoặc cao hơn, phần hướng dẫn tạo dự án cho phép bạn nhanh chóng tạo ra các dự án mới hỗ trợ mã C++.

Bắt đầu bằng cách mở Android Studio và nhấn vào nút Start a new Android Studio project ở màn hình Chào mừng. Trong màn hình tiếp theo, đặt cho ứng dụng của bạn một cái tên có ý nghĩa và tích vào trường Include C++ Support.

Project configuration screenProject configuration screenProject configuration screen

Trong màn hình tạo activity của trình hướng dẫn, chọn tùy chọn Add No Activity. Trong màn hình cuối cùng của trình hướng dẫn, hãy chắc chắn rằng giá trị của trường C++ Standard được thiết lập là Toolchain Default và nhấn nút Finish.

Toolchain selection screenToolchain selection screenToolchain selection screen

Android NDK và các công cụ mà nó phụ thuộc vào không được cài đặt mặc định. Do đó, một khi dự án đã được tạo ra, bạn sẽ thấy một lỗi trông như thế này:

No NDK found errorNo NDK found errorNo NDK found error

Để khắc phục lỗi, vào Tools > Android > SDK Manager và chuyển sang tab SDK Tools.

Trong danh sách các công cụ nhà phát triển sẵn có, chọn CMakeNDK và nhấn nút Apply.

SDK Tools DialogSDK Tools DialogSDK Tools Dialog

Sau khi cài đặt hoàn tất, khởi động lại Android Studio.

3. Tạo một Native Library (thư viện gốc)

Một dự án Android Studio mà có hỗ trợ C++ có một thư mục mã nguồn bổ sung được gọi là cpp. Có thể bạn đã nghĩ rằng, tất cả các tập tin C++ và thư viện phải được đặt bên trong nó. Mặc định, thư mục có một tập tin gọi là native-lib.cpp. Bây giờ, chúng ta sẽ viết tất cả các mã C++ của chúng ta bên trong nó.

Trong hướng dẫn này, chúng ta sẽ tạo một native library đơn giản có chứa một hàm tính toán diện tích của một hình tròn bằng cách sử dụng công thức πr². Hàm sẽ chấp nhận bán kính của hình tròn như là một jdouble và trả về diện tích như là một jstring.

Bắt đầu bằng cách thêm các chỉ thị include vào file:

jni.h là một file header chứa một số định nghĩa vĩ mô, kiểu, cấu trúc và hàm, tất cả đều là không thể thiếu khi làm việc với NDK. (JNI là viết tắt của Java Native Interface, và đây là framework cho phép Java Runtime giao tiếp với mã gốc). File string header là cần thiết bởi vì chúng ta sẽ sử dụng kiểu jstring trong thư viện của chúng ta. File header math.h chứa giá trị số π.

Mặc định, để hỗ trợ đa hình, trình biên dịch C++ sửa đổi tên của tất cả các hàm mà bạn định nghĩa trong mã của bạn. Tính năng này thường được gọi là name mangling (tên xác định trong lệnh). Do name mangling, việc gọi các hàm C++ từ mã Java sẽ xảy ra lỗi. Để tránh các lỗi, bạn có thể vô hiệu hóa name mangling bằng cách định nghĩa các hàm bên trong một khối extern "C".

Tên của các hàm C++ có thể truy cập thông qua JNI phải có định dạng sau:

  • Chúng phải có một tiền tố Java_.
  • Chúng phải chứa một hình thức mangled của tên gói nơi mà các dấu chấm được thay thế bằng các dấu gạch dưới.
  • Chúng phải chứa tên của các lớp Java mà chúng thuộc về.

Ngoài ra, bạn phải xác định phạm vi của các hàm. Bạn có thể làm như vậy bằng cách sử dụng macro JNIEXPORT. Theo quy ước, hầu hết các nhà phát triển include macro JNICALL ở trong định nghĩa hàm, mặc dù nó hiện tại nó không phục vụ mục đích nào trong Android.

Đoạn mã sau định nghĩa một hàm được gọi là calculateArea, có thể được truy cập từ một lớp Java được gọi là MainActivity:

Lưu ý rằng ngoài bán kính, hàm cũng chấp nhận một kiểu JNIEnv, có các hàm hữu ích, bạn có thể sử dụng để xử lý các kiểu Java, và một thể hiện của jobject, tham chiếu đến một thể hiện của MainActivity. Tất nhiên chúng ta sẽ tạo một MainActivity sau trong bài hướng dẫn này.

Tính toán diện tích thì dễ dàng. Tất cả những gì bạn cần làm là nhân macro M_PI với bình phương của bán kính radius.

Chỉ cần bạn đã biết cách xử lý chuỗi khi làm việc với JNI, bây giờ chúng ta hãy tạo một chuỗi mới chứa một thông điệp nói lên diện tích là bao nhiêu. Để làm như vậy, bạn có thể sử dụng hàm sprintf().

Bởi vì Java không thể trực tiếp xử lý một mảng các ký tự C++, nên kiểu trả về của hàm chúng ta là jstring. Để chuyển đổi mảng output thành một đối tượng jstring, bạn phải sử dụng hàm NewStringUTF().

Tại thời điểm hiện tại, mã C++ của chúng ta đã sẵn sàng.

4. Sử dụng Native Library

Ở bước trước, bạn đã thấy hàm calculateArea() cần phải thuộc về lớp Java MainActivity. Bắt đầu tạo lớp bằng cách bấm chuột phải vào tên của gói Java và chọn File > New > Empty Activity.

Trong hộp thoại bật lên, đặt tên activity là MainActivity. Sau khi chắc chắn rằng tùy chọn Launcher Activity được chọn, nhấn nút Finish.

Create a new launcher activityCreate a new launcher activityCreate a new launcher activity

Native library phải được nạp trước khi nó có thể được sử dụng. Do đó, thêm một khối static vào lớp và nạp thư viện bằng cách sử dụng các phương thức loadLibrary() của lớp System.

Để có thể sử dụng hàm C++ calculateArea() bên trong activity, bạn phải khai báo nó như là một phương thức native.

Bây giờ bạn có thể sử dụng phương thức calculateArea() giống như bất kỳ phương thức thông thường của Java. Ví dụ, bạn có thể thêm mã sau đây vào phương thức onCreate() để tính toán và in ra diện tích vòng tròn có bán kính là 5,5:

Nếu bạn chạy ứng dụng, bạn có thể nhìn thấy đầu ra sau đây trong cửa sổ logcat:

Output in logcatOutput in logcatOutput in logcat

Kết luận

Trong hướng dẫn này, bạn đã học cách tạo một thư viện gốc C++ và sử dụng nó trong một ứng dụng Android. Điều cần lưu ý là tiến trình xây dựng mã gốc mặc định tạo ra một file .so riêng cho mỗi một kiến trúc CPU mà NDK hỗ trợ. Do đó, bạn có thể chắc chắn rằng các ứng dụng của bạn sẽ chạy trên hầu hết thiết bị Android mà không có bất kỳ vấn đề nào.

Để tìm hiểu thêm về Android NDK, tôi đề nghị bạn tham khảo hướng dẫn NDK.

Và tìm hiểu một số hướng dẫn và các khóa học trong phát triển Android của chúng tôi!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.