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

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Bạn có thể thêm mã C và C++ vào dự án Android bằng cách đặt mã vào thư mục cpp trong mô-đun dự án của mình. Khi bạn xây dựng dự án, mã này được biên dịch thành một thư viện gốc mà Gradle có thể đóng gói bằng ứng dụng của bạn. Sau đó, mã Java hoặc Kotlin có thể gọi các hàm trong thư viện gốc của bạn thông qua Giao diện gốc Java (JNI). Để tìm hiểu thêm về cách sử dụng khung JNI, hãy đọc các mẹo của JNI dành cho Android.

Android Studio hỗ trợ CMake, một công cụ phù hợp với các dự án nhiều nền tảng và ndk-build, có thể nhanh hơn CMake nhưng chỉ hỗ trợ Android. Chúng tôi hiện không hỗ trợ sử dụng cả CMake và ndk-build trong cùng một mô-đun.

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

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

Thay vào đó, nếu bạn muốn thêm mã gốc vào một dự án hiện có, bạn cần phải làm theo các bước sau:

  1. Tạo các tệp nguồn gốc mới và thêm các tệp đó vào dự án Android Studio.
    • Bạn có thể bỏ qua bước này nếu đã có mã gốc hoặc muốn nhập một thư viện gốc được tạo sẵn.
  2. Định cấu hình CMake để tích hợp mã nguồn gốc của bạn vào thư viện. Bạn cũng cần có tập lệnh bản dựng này nếu đang nhập và liên kết với các thư viện hoặc nền tảng được tạo sẵn.
    • Nếu một thư viện gốc hiện có của bạn đã có tập lệnh bản dựng CMakeLists.txt, hoặc sử dụng ndk-build và bao gồm một tập lệnh bản dựng Android.mk thì bạn có thể bỏ qua bước này.
  3. Định cấu hình Gradle bằng cách cung cấp một đường dẫn cho tệp tập lệnh CMake hoặc ndk-build. Gradle sẽ sử dụng tập lệnh bản dựng để nhập mã nguồn vào dự án Android Studio của bạn và đóng gói thư viện gốc của bạn (tệp SO) vào ứng dụng đó.

Sau khi định cấu hình dự án, bạn có thể truy cập vào các hàm gốc từ mã Java hoặc Kotlin bằng khung JNI. Để xây dựng và chạy ứng dụng, bạn chỉ cần nhấp vào Chạy chạy rồi chạy ứng dụng từ thanh trình đơn.

Lưu ý: Nếu dự án hiện tại của bạn sử dụng công cụ ndkCompile không còn được dùng nữa, bạn nên chuyển sang dùng CMake hoặc ndk-build. Để tìm hiểu thêm, hãy chuyển đến phần về cách Di chuyển từ ndkCompile.

Chú ý đến người dùng Gradle thử nghiệm: Hãy cân nhắc việc di chuyển sang trình bổ trợ phiên bản 2.2.0 trở lên và sử dụng CMake hoặc ndk-build để xây dựng thư viện gốc nếu có trường hợp sau đây áp dụng cho bạn: Dự án gốc của bạn đã sử dụng CMake hoặc ndk-build; bạn muốn sử dụng phiên bản ổn định của hệ thống xây dựng Gradle; hoặc bạn muốn được hỗ trợ cho các công cụ tiện ích bổ sung, chẳng hạn như CCache. Nếu không, bạn có thể tiếp tục sử dụng phiên bản thử nghiệm của Gradle và trình bổ trợ Android.

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

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

  • Native Development Kit (NDK) dành cho Android: một bộ công cụ cho phép bạn sử dụng mã C và C++ với Android, đồng thời 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 gốc và truy cập vào các thành phần thiết bị thực tế, chẳng hạn như cảm biến và tính năng nhập bằng cách nhấn.
  • CMake: một công cụ bản dựng ngoài hoạt động cùng với Gradle để tạo thư viện gốc của bạn. Nếu bạn chỉ định sử dụng bản dựng ndk thì không cần đến thành phần này.
  • LLDB: trình gỡ lỗi mà Android Studio sử dụng để gỡ lỗi mã gốc.

Để biết thông tin về cách cài đặt các thành phần này, vui lòng xem phần Cài đặt và định cấu hình NDK, CMake và LLDB.

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

Cách tạo một dự án mới có hỗ trợ mã gốc cũng tương tự như cách tạo mọi dự án Android Studio khác, nhưng có thêm một bước nữa:

  1. Trong mục Chọn dự án của bạn trong trình hướng dẫn, chọn loại dự án C++ gốc.
  2. Nhấp vào Tiếp theo.
  3. Hoàn thành tất cả các trường khác trong mục tiếp theo của trình hướng dẫn.
  4. Nhấp vào Tiếp theo.
  5. Trong mục Tùy chỉnh Hỗ trợ C++ của trình hướng dẫn, bạn có thể tùy chỉnh dự án của mình với trường Tiêu chuẩn C++. Sử dụng danh sách thả xuống để chọn quá trình chuẩn hóa C++ mà bạn muốn sử dụng. Chọn Chế độ mặc định cho Chuỗi công cụ thì có nghĩa là sẽ sử dụng chế độ cài đặt CMake mặc định.
  6. Nhấp vào Hoàn tất.

Sau khi Android Studio hoàn tất quá trình tạo dự án mới, hãy mở ngăn Dự án ở phía bên trái của IDE và chọn chế độ xem Android. Như minh họa trong hình 2, Android Studio sẽ thêm nhóm cpp:

Hình 2. Nhóm chế độ xem Android cho nguồn mã gốc và tập lệnh bản dựng ngoài.

Lưu ý: Chế độ xem này không phản ánh hệ phân cấp tệp thực tế trên ổ đĩa, mà nhóm các tệp tương tự nhau để tinh giản quá trình điều hướng trong 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 mã gốc, tiêu đề, tập lệnh bản dựng cho CMake hoặc bản dựng ndk và các thư viện có sẵn nằm trong dự án của bạn. Đối với các dự án mới, Android Studio sẽ tạo một tệp nguồn C++ mẫu, native-lib.cpp và đặt tệp đó vào thư mục src/main/cpp/ của mô-đun ứng dụng. Mã mẫu này cung cấp một hàm C++ đơn giản, stringFromJNI(), hàm trả về chuỗi "Xin chào từ C++". Bạn có thể tìm hiểu cách thêm tệp nguồn bổ sung vào dự án trong mục hướng dẫn Tạo tệp nguồn mã gốc mới.

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

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

Khi bạn nhấp vào Chạy chạy rồi chạy ứng dụng từ thanh trình đơn, Android Studio sẽ xây dựng và chạy một ứng dụng hiển thị văn bản "Xin chào từ C++" trên thiết bị hoặc trình mô phỏng Android của bạn. Phần tổng quan sau đây mô tả các sự kiện xảy ra để xây dựng và chạy ứng dụng mẫu:

  1. Gradle yêu cầu tập lệnh bản dựng ngoài, CMakeLists.txt.
  2. CMake thực hiện các lệnh trong tập lệnh bản dựng để biên dịch tệp nguồn C++, native-lib.cpp, thành một thư viện đối tượng dùng chung và đặt tên cho tệp này là libnative-lib.so, sau đó Gradle sẽ gói tệp này vào trong ứng dụng.
  3. Trong thời gian chạy, MainActivity của ứng dụng sẽ tải thư viện gốc bằng cách sử dụng System.loadLibrary(). Hàm gốc của thư viện, stringFromJNI(), hiện đã có trong ứng dụng.
  4. MainActivity.onCreate() gọi stringFromJNI(), câu lệnh trả về "Xin chào từ C++" và dùng câu lệnh trả về này để cập nhật TextView.

Lưu ý: Tính năng Chạy tức thì không tương thích với các thành phần của dự án được viết bằng mã gốc.

Nếu muốn xác minh rằng Gradle đã gói thư viện gốc trong ứng dụng, bạn có thể sử dụng Công cụ phân tích APK:

  1. Chọn Build (Xây dựng) > Build Bundles(s) / APK(s) ( (Xây dựng gói / tệp APK) > Build APK(s) (Xây dựng tệp APK)
  2. Chọn Build (Xây dựng) > Analyze APK (Phân tích APK).
  3. Chọn APK hoặc AAB từ thư mục app/build/outputs/ và nhấp vào OK.
  4. Như minh họa trong hình 3, bạn có thể thấy libnative-lib.so trong cửa sổ Công cụ phân tích APK trong lib/<ABI>/.

    Hình 3. Định vị thư viện gốc bằng Công cụ phân tích APK.

Mẹo: Nếu bạn muốn thử nghiệm với các ứng dụng Android khác có sử dụng mã gốc, hãy nhấp vào File > New > Import Sample (Tệp > Mới > Nhập mẫu) rồi chọn một dự án mẫu từ Danh sách Ndk.

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

Để thêm 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 nhóm tài nguyên chính của ứng dụng, hãy tạo một thư mục như sau:
    1. Mở ngăn Dự án từ bên trái của IDE và chọn chế độ xem Dự án từ trình đơn thả xuống.
    2. Điều hướng tới your-module > src, nhấp chuột phải vào thư mục chính rồi chọn New > Directory (Mới > Thư mục).
    3. Nhập cpp làm tên thư mục và nhấp vào OK.

  2. Nhấp chuột phải vào thư mục cpp/ rồi chọn New > C/C++ Source File (Mới > Tệp nguồn C/C++).
  3. Nhập tên cho tệp nguồn, chẳng hạn như native-lib.
  4. Từ trình đơn thả xuống Loại, hãy chọn đuôi tệp cho tệp nguồn, chẳng hạn như .cpp.
    • Bạn có thể thêm các loại tệp khác vào trình đơn thả xuống, chẳng hạn như .cxx hoặc .hxx, bằng cách nhấp vào phần Chỉnh sửa loại tệp . Trong hộp thoại C/C++ bật lên, hãy chọn một đuôi tệp khác từ trình đơn thả xuống Phần mở rộng nguồnPhần mở rộng tiêu đề rồi nhấp vào OK.
  5. Nếu bạn cũng muốn tạo tệp tiêu đề, hãy đánh dấu vào hộp đánh dấu Tạo tiêu đề liên kết.
  6. Nhấp vào OK.

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

Tài nguyên khác

Để tìm hiểu thêm về cách hỗ trợ mã C/C++ trong ứng dụng của bạn, hãy thử dùng tài nguyên sau đây.

Lớp học lập trình

  • Tạo Hello-CMake với Android Studio, một lớp học lập trình sẽ hướng dẫn cho bạn biết cách sử dụng mẫu Android Studio CMake để bắt đầu phát triển dự án Android NDK