Tôi đã tạo một dự án mới chứa C++ NDK. Vì vậy nó tự động tạo ra mộtCMakeLists.txt
tập tin và mộtcpp
Mục lục. Nhưng khi tôi tạo một tập tin có tên jni
một thư mục mới và thử đặt vào kiểm tra.c
,Android.mk
Và Ứng dụng.mk
tệp, tôi nhận được thông báo lỗi này khi tôi muốn đồng bộ hóa dự án của mình:
Tệp này không phải là một phần của proejct. Vui lòng đưa nó vào tệp xây dựng phù hợp
android.mk:
LOCAL_PATH := $(gọi my-dir)
bao gồm $(CLEAR_VARS)
LOCAL_MODULE := ndktest
LOCAL_SRC_FILES := test.c
ứng dụng.mk:
APP_ABI := tất cả
kiểm tra.c:
#include
#include
bên ngoài "C"
Chuỗi JNIEXPORT JNICALL
Java_com_example_m_ndktest_MainActivity_testJNI(JNIEnv *env, phiên bản jobject)
{
return env->NewStringUTF(hello.c_str());
}
Chuỗi JNIEXPORT JNICALL
Java_com_example_m_ndktest_MainActivity_testJNI2(JNIEnv *env, phiên bản jobject)
{
return (*env)->NewStringUTF(env, "hellooooo");
}
Tôi nên thêm của tôi như thế nào .mk
tập tin chứa trong CMakeLists.txt
ở giữa?
CMakeLists.txt:
# Để biết thêm thông tin về cách sử dụng CMake với Android Studio, hãy đọc phần
# Đặt phiên bản CMake tối thiểu cần thiết để xây dựng thư viện gốc.
cmake_minimum_required(PHIÊN BẢN 3.4.1)
# Tạo và đặt tên một thư viện, đặt nó là STATIC
# hoặc CHIA SẺ và cung cấp các đường dẫn tương đối tới mã nguồn của nó.
# Bạn có thể xác định nhiều thư viện và CMake xây dựng chúng cho bạn.
# Gradle tự động đóng gói các thư viện được chia sẻ bằng APK của bạn.
add_library( # Đặt tên của thư viện.
bản địa-lib
# Đặt thư viện làm thư viện dùng chung.
ĐÃ CHIA SẺ
# Cung cấp đường dẫn tương đối tới (các) tệp nguồn của bạn.
src/main/cpp/native-lib.cpp )
# Tìm kiếm thư viện dựng sẵn được chỉ định và lưu trữ đường dẫn dưới dạng
# biến. Bởi vì CMake bao gồm các thư viện hệ thống trong đường dẫn tìm kiếm.
# mặc định, bạn chỉ cần xác định tên thư viện NDK public
# bạn muốn thêm CMake xác minh rằng thư viện đã tồn tại trước đó.
# hoàn thành bản dựng của nó.
find_library( # Đặt tên của biến đường dẫn.
log-lib
# Chỉ định tên của thư viện NDK
# bạn muốn CMake định vị.
nhật ký )
# Chỉ định thư viện CMake sẽ liên kết với thư viện mục tiêu của bạn.
# có thể liên kết nhiều thư viện, chẳng hạn như các thư viện bạn xác định trong này
# tập lệnh xây dựng, thư viện bên thứ ba dựng sẵn hoặc thư viện hệ thống.
target_link_libraries( # Chỉ định thư viện đích.
bản địa-lib
# Liên kết thư viện đích với thư viện nhật ký
# được bao gồm trong NDK.
${log-lib} )
***Ngoài ra, tôi có một câu hỏi, tôi có thể tìm hướng dẫn về cú pháp STRANGE mà chúng ta nên viết trong Android-ndk ở đâu? (ý tôi là cú pháp test.c mà tôi đã sao chép từ mặc định bản địa-lib.c
)
Android Studio có khái niệm về các bản dựng gốc bên ngoài. Đối với các bản dựng gốc bên ngoài này, bạn có haiTùy chọn:
CMake có vẻ hiện đại hơn và do đó có lẽ phù hợp hơn cho tương lai. Tôi khuyên bạn nên sử dụng cái đó.
Điều này có nghĩa là bạn viết một CMakeLists.txt
tập tin (thường là trong jni/
trong thư mục. )
Bạn không còn cần bất kỳ tệp .mk nào nữa, chúng được sử dụng bởi bản dựng gốc bên ngoài ndk-build chứ không phải bản dựng CMake.
Để cho biết bạn đang sử dụng hệ thống xây dựng gốc bên ngoài nào, bạn có thể sử dụng tệp gradle của ứng dụng.
Android {
cấu hình mặc định {
bên ngoàiNativeBuild {
cmake {
cppFlags "..."
lập luận "..."
}
}
}
}
Trong tệp CMakeLists.txt, bạn mô tả cách xây dựng thư viện .so gốc. Điều này bao gồm việc liệt kê mọi thứ cần thiết để xây dựng nó .c
Và .cpp
tập tin nguồn. Việc này được thực hiện thông qua CMake add_library() Hoàn thành. Vĩ mô.
Tóm lại, định nghĩa dự án mới của bạn sẽ chứa một tệp gradle và một (hoặc nhiều) tệp CMakeLists.txt, nhưng bạn sẽ không cần bất kỳ tệp .mk nào nữa.
Tôi là một lập trình viên xuất sắc, rất giỏi!