Tôi đã cố gắng hack vào một dự án Android được quản lý Gradle sử dụng JNI và tôi đang gặp một chút rắc rối. Tôi hiểu hỗ trợ NDK vẫn còn tương đối mới và hầu hết là không có giấy tờ, nhưng tôi đã xoay xở để tìm ra những yếu tố cơ bản để đánh giày nó thành một Gradle build. Rõ ràng Bí quyết là để bao gồm tất cả các mã mẹ đẻ của bạn dưới src/main/jni
và thả các điều sau đây trong một trong configs của bạn (ví dụ như trong khối defaultConfig
):NDK Dev trong một dự án thư viện Android với Gradle & Android Studio
ndk {
moduleName "mylib"
}
Vấn đề là khi tôi cố gắng để xây dựng dự án của tôi, ndk plugin tạo tệp Android.mk bao gồm đường dẫn tuyệt đối tới nguồn gốc. Điều này làm cho make
bị nghẹt thở vì nó VẪN xem xét các đường dẫn tương đối. Trong trường hợp của tôi, tôi có một dự án thư viện đơn giản với 1 cpp nguồn/tiêu đề kết hợp dưới src/main/jni
và tôi sử dụng này gradle.build
:
apply plugin: 'android-library'
android {
compileSdkVersion 19
buildToolsVersion "19.0.3"
defaultConfig {
minSdkVersion 9
targetSdkVersion 19
versionCode 1
versionName "1.0"
ndk {
moduleName "mylib"
}
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:19.+'
}
Chạy xây dựng tạo ra Android.mk này dưới build/ndk/debug:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := \
/Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/Android.mk \
/Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/myNativeSectionTextProvider.cpp \
LOCAL_C_INCLUDES += /Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni
LOCAL_C_INCLUDES += /Users/clifton/dev/Multi/MultiAndroid/lib/src/debug/jni
include $(BUILD_SHARED_LIBRARY)
... mà khi chạy tạo ra lỗi này:
make: *** No rule to make target `/Users/clifton/dev/Multi/MultiAndroid/lib/build/ndk/debug//Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/myNativeSectionTextProvider.cpp', needed by `/Users/clifton/dev/Multi/MultiAndroid/lib/build/ndk/debug/obj/local/armeabi-v7a/objs/mylib//Users/clifton/dev/Multi/MultiAndroid/lib/src/main/jni/myNativeSectionTextProvider.o'. Stop.
... bởi vì các đường dẫn tuyệt đối được chuyển nhầm đến tương đối. Nếu tôi tự chỉnh sửa các tập tin và thay đổi các đường dẫn đến tương đối như sau:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := \
../../../src/main/jni/Android.mk \
../../../src/main/jni/myNativeSectionTextProvider.cpp \
LOCAL_C_INCLUDES += ../../../src/main/jni
LOCAL_C_INCLUDES += ../../../src/debug/jni
include $(BUILD_SHARED_LIBRARY)
... sau đó tôi nhận được lỗi này:
/Users/clifton/dev/Multi/MultiAndroid/lib/build/ndk/debug/../../../src/main/jni/com_craig_multiandroid_app_NativeSectionTextProvider.h:2:17: fatal error: jni.h: No such file or directory
Câu hỏi của tôi là những gì tôi có thể làm gì để khắc phục điều này? Tôi bắt đầu để hack hỗ trợ gradle tùy chỉnh của riêng tôi cho xây dựng .aar nhưng đã bị mất cố gắng để tìm ra nhiệm vụ Gradle có trách nhiệm tạo ra các tập tin .aar. (Các tài liệu Gradle, trong khi phong phú, làm cho nó khó khăn để tìm các chi tiết trên một API nhiệm vụ Gradle Android cụ thể.) Tôi có một gradle.build làm việc một phần sẽ chạy ndk-xây dựng thông qua dòng cmd, tạo ra .so nhưng tôi có thể ' t tìm ra cách để (hoặc thậm chí nếu tôi nên) nội tuyến .so bên trong .aar. Tôi đang sử dụng Android Studio 0.5.7 và Gradle 1.11. Tôi đã kéo nguồn Gradle cách đây vài tháng, đó là cách tôi đã tìm ra cách để nội tuyến các tệp .so và gdbserver trong một dự án .apk thông thường nhưng những quy tắc đó dường như không áp dụng cho các dự án .aar. Có ai khác đã cố gắng này? Tôi có thể đi đâu để trả lời?