Tài liệu

Hãy thêm mã C và C++ vào dự án của bạn

Huy Erick

Bạn có biết rằng bạn có thể thêm mã C và C++ vào dự án Android của mình không? Rất đơn giản! Bạn chỉ cần đặt mã vào thư mục cpp trong module dự án...

Bạn có biết rằng bạn có thể thêm mã c+ +' class='hover-show-link replace-link-2121'>c và c++ vào dự án Android của mình không? Rất đơn giản! Bạn chỉ cần đặt mã vào thư mục cpp trong module dự án của bạn. Khi bạn xây dựng dự án, mã này sẽ được biên dịch thành một thư viện native mà Gradle có thể đóng gói cùng với ứng dụng của bạn. Mã Java hoặc Kotlin của bạn sau đó có thể gọi các hàm trong thư viện native của bạn thông qua Java Native Interface (JNI). Để tìm hiểu thêm về việc sử dụng khung JNI, hãy đọc các mẹo JNI cho Android.

Android Studio hỗ trợ CMake, đây là một công cụ hữu ích cho các dự án đa nền tảng. Android Studio cũng hỗ trợ ndk-build, công cụ này có thể nhanh hơn CMake nhưng chỉ hỗ trợ Android. Tuy nhiên, hiện tại không hỗ trợ sử dụng cả CMake và ndk-build trong cùng một module.

Để nhập thư viện ndk-build hiện có vào dự án Android Studio của bạn, hãy tìm hiểu cách liên kết Gradle với dự án thư viện nguồn.

Trang này sẽ chỉ cho bạn cách thiết lập Android Studio với các công cụ xây dựng cần thiết, tạo một dự án mới với hỗ trợ C/C++ và thêm các tệp C/C++ mới vào dự án của bạn.

Nếu bạn muốn thay vì thêm mã native vào dự án mới, hãy tuân thủ các bước sau:

  1. Tạo các tệp nguồn native mới và thêm các tệp vào dự án Android Studio của bạn.

  2. Cấu hình CMake để xây dựng mã nguồn native của bạn thành một thư viện. Tập lệnh xây dựng này là bắt buộc nếu bạn đang nhập khẩu và liên kết với thư viện nguồn hoặc thư viện nền tảng đã được xây dựng sẵn.

  3. Cấu hình Gradle bằng cách cung cấp đường dẫn đến tệp script CMake hoặc ndk-build của bạn. Gradle sử dụng tập lệnh xây dựng để nhập mã nguồn vào dự án Android Studio và đóng gói thư viện native vào ứng dụng.

Sau khi bạn cấu hình dự án của mình, bạn có thể sử dụng các hàm native từ mã Java hoặc Kotlin bằng cách sử dụng khung JNI. Để xây dựng và chạy ứng dụng của bạn, hãy nhấp vào Run.

Lưu ý: Nếu dự án hiện tại của bạn đang sử dụng công cụ ndkCompile đã bị lỗi, hãy chuyển sang sử dụng CMake hoặc ndk-build.

Tải NDK và các công cụ xây dựng

Để biên dịch và gỡ lỗi mã nguồn native cho ứng dụng của bạn, bạn cần các thành phần sau:

  • Development Kit Native Android (NDK): một bộ công cụ cho phép bạn sử dụng mã C và C++ với Android. NDK cung cấp các thư viện nền tảng cho phép bạn quản lý các hoạt động native và truy cập các thành phần của thiết bị vật lý, chẳng hạn như các cảm biến và đầu vào chạm.
  • CMake: một công cụ xây dựng bên ngoài hoạt động cùng với Gradle để xây dựng thư viện native của bạn. Bạn không cần thành phần này nếu bạn chỉ dự định sử dụng ndk-build.
  • LLDB: trình gỡ lỗi trong Android Studio dùng để gỡ lỗi mã nguồn native.

Để biết thông tin về cách cài đặt các thành phần này, hãy xem Hướng dẫn cài đặt và cấu hình NDK và CMake.

Tạo dự án mới với hỗ trợ C/C++

Để tạo một dự án mới với hỗ trợ mã nguồn native, quá trình này tương tự như tạo bất kỳ dự án Android Studio nào khác, nhưng có một bước bổ sung:

  1. Trong phần "Chọn dự án của bạn" trong trình tự, chọn loại dự án "Native C++".
  2. Nhấp vào "Tiếp theo".
  3. Hoàn thành tất cả các trường khác trong phần tiếp theo của trình tự.
  4. Nhấp vào "Tiếp theo".
  5. Trong phần "Tùy chỉnh hỗ trợ C++" của trình tự, bạn có thể tùy chỉnh dự án của mình với trường "C++ Standard". Bạn có thể sử dụng danh sách thả xuống để chọn tiêu chuẩn hóa C++ mà bạn muốn sử dụng. Lựa chọn "Toolchain Default" sử dụng cấu hình mặc định của CMake.
  6. Nhấp vào "Hoàn thành".

Sau khi Android Studio hoàn thành việc tạo dự án mới, hãy mở thanh "Project" ở phía trái của IDE và chọn chế độ xem "Android" trong menu. Như được hiển thị trong hình 1, Android Studio đã thêm nhóm "cpp":

Hình 1: Nhóm "cpp" trong chế độ xem Android cho các nguồn native và các tập lệnh xây dựng bên ngoài.

Lưu ý: Chế độ xem này không phản ánh cấu trúc thư mục thực tế trên đĩa, nhưng nhóm các tệp tương tự để dễ dàng điều hướng dự án của bạn.

Nhóm "cpp" là nơi bạn có thể tìm thấy tất cả các tệp nguồn native, tiêu đề, tập lệnh xây dựng cho CMake hoặc ndk-build và các thư viện được xây dựng sẵn là một phần của dự án của bạn. Đối với các dự án mới, Android Studio sẽ tạo một tệp mã nguồn C++ mẫu, native-lib.cpp và đặt nó trong thư mục src/main/cpp/ của module ứng dụng của bạn. Mã mẫu này cung cấp một hàm C++ đơn giản, stringFromJNI(), trả về chuỗi "Hello from C++". Hãy tìm hiểu cách thêm các tệp nguồn bổ sung vào dự án của bạn trong phần về cách tạo các tệp nguồn native mới.

Tương tự như cách file build.gradle chỉ dẫn Gradle cách xây dựng ứng dụng của bạn, CMake và ndk-build đều yêu cầu một tập lệnh xây dựng để biết cách xây dựng thư viện native của bạn. Đối với các dự án mới, Android Studio tạo một tập lệnh build CMake, CMakeLists.txt, và đặt nó trong thư mục gốc của module. Để biết thêm thông tin về nội dung của tập lệnh xây dựng này, hãy đọc phần Cấu hình CMake.

Xây dựng và chạy ứng dụng mẫu

Khi bạn nhấp vào "Run", Android Studio sẽ xây dựng và khởi chạy một ứng dụng hiển thị văn bản "Hello from C++" trên thiết bị Android hoặc trình giả lập của bạn. Tổng quan sau mô tả các sự kiện xảy ra trong quá trình xây dựng và chạy ứng dụng mẫu:

  1. Gradle gọi tập lệnh xây dựng bên ngoài của bạn, CMakeLists.txt.

  2. CMake làm theo các lệnh trong tập lệnh xây dựng để biên dịch một tệp nguồn C++ thành một thư viện đối tượng chia sẻ và đặt tên là libnative-lib.so. Sau đó, Gradle đóng gói nó vào ứng dụng.

  3. Trong quá trình chạy, MainActivity của ứng dụng tải thư viện native bằng cách sử dụng System.loadLibrary(). Hàm native trong thư viện, stringFromJNI(), hiện đã sẵn có cho ứng dụng.

  4. MainActivity.onCreate() gọi stringFromJNI(), hàm này trả về "Hello from C++" và sử dụng nó để cập nhật TextView.

Để xác nhận rằng Gradle đóng gói thư viện native trong ứng dụng, hãy sử dụng APK Analyzer:

  1. Chọn "Build > Build Bundle(s) / APK(s) > Build APK(s)".

  2. Chọn "Build > Analyze APK".

  3. Chọn APK hoặc AAB từ thư mục app/build/outputs/ và nhấp vào "OK".

Như được hiển thị trong hình 2, bạn có thể thấy libnative-lib.so trong cửa sổ APK Analyzer dưới lib//.

Hình 2: Định vị thư viện native bằng cách sử dụng APK Analyzer.

Gợi ý: Nếu bạn muốn thử nghiệm với các ứng dụng Android khác sử dụng mã nguồn native, hãy nhấp "File > New > Import Sample" và chọn một dự án mẫu từ danh sách "Ndk".

Tạo các tệp nguồn C/C++ mới

Để thêm các tệp nguồn C/C++ mới vào dự án hiện có, hãy tiến hành như sau:

  1. Nếu bạn chưa có thư mục cpp/ trong bộ nguồn chính của ứng dụng, hãy tạo một thư mục như sau:

    • Mở thanh "Project" ở phía trái của IDE và chọn chế độ xem "Project".
    • Di chuyển đến "your-module > src".
    • Nhấp chuột phải vào thư mục "main" và chọn "New > Directory".
    • Nhập "cpp" là tên thư mục và nhấp vào "OK".
  2. Nhấp chuột phải vào thư mục cpp/ và chọn "New > C/C++ Source File". Nhập tên cho tệp nguồn của bạn, chẳng hạn như "native-lib". Từ menu "Type", chọn phần mở rộng tệp cho tệp nguồn của bạn, chẳng hạn như ".cpp".

    • Nhấp vào "Edit File Types" để thêm các loại tệp khác vào menu, chẳng hạn như .cxx hoặc .hxx. Trong hộp thoại "New File Extensions" hiển thị, chọn một phần mở rộng tệp khác từ các menu "Source Extension" và "Header Extension" và nhấp vào "OK".
  3. Để tạo tệp tiêu đề, chọn "Create an associated header" checkbox. Nhấp vào "OK".

Sau khi bạn đã thêm các tệp C/C++ mới vào dự án của mình, bạn vẫn cần cấu hình CMake để bao gồm các tệp trong thư viện native của bạn.

Tài liệu tham khảo bổ sung

Để tìm hiểu thêm về việc hỗ trợ mã nguồn C/C++ trong ứng dụng của bạn, hãy thử tài liệu tham khảo sau:

  • Codelabs: Tạo Hello-CMake với Android Studio. Codelab này sẽ chỉ cho bạn cách sử dụng mẫu CMake của Android Studio để bắt đầu phát triển dự án NDK Android.
1