Với việc cập nhật Android Studio lên 1.0, hỗ trợ chuỗi công cụ NDK đã cải thiện rất nhiều ( lưu ý: vui lòng đọc các cập nhật của tôi ở cuối bài đăng này để xem cách sử dụng với plugin Gradle thử nghiệm mới và Android Studio 1.5 ).
Android Studio và NDK được tích hợp đủ tốt để bạn chỉ cần tạo một khối ndk {} trong build.gradle của mô-đun và đặt các tệp nguồn của bạn vào thư mục (mô-đun) / src / main / jni - và bạn làm xong!
Không còn ndk-build từ dòng lệnh.
Tôi đã viết tất cả về nó trong bài đăng trên blog của tôi ở đây: http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
Các điểm nổi bật là:
Có hai điều bạn cần biết ở đây. Theo mặc định, nếu bạn có các lib bên ngoài mà bạn muốn tải vào ứng dụng Android, chúng sẽ được tìm kiếm trong (mô-đun) / src / main / jniLibs theo mặc định. Bạn có thể thay đổi điều này bằng cách sử dụng cài đặt sourceSets.main.jniLibs.srcDirs trong build.gradle của mô-đun. Bạn sẽ cần một thư mục con với các thư viện cho mỗi kiến trúc bạn đang nhắm mục tiêu (ví dụ: x86, arm, mips, arm64-v8a, v.v ...)
Mã bạn muốn được biên dịch theo mặc định bởi công cụ NDK sẽ được đặt trong (mô-đun) / src / main / jni và tương tự như trên, bạn có thể thay đổi mã bằng cách đặt sourceSets.main.jni.srcDirs trong build.gradle của mô-đun của bạn
và đặt cái này vào build.gradle của mô-đun của bạn:
ndk {
moduleName "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
cFlags "-std=c++11 -fexceptions" // Add provisions to allow C++11 functionality
stl "gnustl_shared" // Which STL library to use: gnustl or stlport
}
Đó là quá trình biên dịch mã C ++ của bạn, từ đó bạn cần tải nó và tạo các hàm bao - nhưng đánh giá từ câu hỏi của bạn, bạn đã biết cách thực hiện tất cả điều đó, vì vậy tôi sẽ không băm lại.
Ngoài ra, tôi đã đặt một repo Github của ví dụ này tại đây: http://github.com/sureshjoshi/android-ndk-swig-example
CẬP NHẬT: ngày 14 tháng 6 năm 2015
Khi Android Studio 1.3 xuất hiện, cần có sự hỗ trợ tốt hơn cho C ++ thông qua plugin JetBrains CLion. Tôi hiện đang theo giả định rằng điều này sẽ cho phép phát triển Java và C ++ từ bên trong Android Studio; tuy nhiên tôi nghĩ rằng chúng ta vẫn cần sử dụng phần Gradle NDK như tôi đã nêu ở trên. Ngoài ra, tôi nghĩ vẫn sẽ cần phải viết các tệp trình bao bọc Java <-> C ++, trừ khi CLion sẽ tự động thực hiện chúng.
CẬP NHẬT: ngày 5 tháng 1 năm 2016
Tôi đã cập nhật blog và Github repo (trong nhánh phát triển) để sử dụng Android Studio 1.5 với plugin Gradle thử nghiệm mới nhất (0.6.0-alpha3).
http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
http://github.com/sureshjoshi/android-ndk-swig-example
Bản dựng Gradle cho phần NDK bây giờ trông như thế này:
android.ndk {
moduleName = "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
cppFlags.add("-std=c++11") // Add provisions to allow C++11 functionality
cppFlags.add("-fexceptions")
stl = "gnustl_shared" // Which STL library to use: gnustl or stlport
}
Ngoài ra, khá khủng khiếp, Android Studio đã tự động hoàn thành cho C ++ - các trình bao bọc được tạo bởi Java bằng cách sử dụng từ khóa 'gốc':
Tuy nhiên, nó không hoàn toàn màu hồng ... Nếu bạn đang sử dụng SWIG để bọc thư viện để tự động tạo mã, sau đó thử sử dụng tự động tạo từ khóa gốc, nó sẽ đặt mã sai vị trí trong Swig _wrap của bạn Tệp .cxx ... Vì vậy, bạn cần di chuyển nó vào khối "extern C":
CẬP NHẬT: ngày 15 tháng 10 năm 2017
Tôi sẽ cảm thấy hối hận nếu tôi không đề cập rằng Android Studio 2.2 trở đi về cơ bản có hỗ trợ 'bản địa' (không chơi chữ) cho chuỗi công cụ NDK thông qua Gradle và CMake. Bây giờ, khi bạn tạo một dự án mới, chỉ cần chọn hỗ trợ C ++ và bạn đã sẵn sàng.
Bạn vẫn sẽ cần tạo mã lớp JNI của riêng mình hoặc sử dụng kỹ thuật SWIG mà tôi đã đề cập ở trên, nhưng giàn giáo của một dự án C ++ trong Android là không đáng kể.
Các thay đổi trong tệp CMakeLists (là nơi bạn đặt các tệp nguồn C ++ của mình) sẽ được Android Studio chọn và nó sẽ tự động biên dịch lại bất kỳ thư viện liên quan nào.