Я пытался взломать проект под управлением Gradle, который использует JNI, и у меня проблемы. Я понимаю, что поддержка NDK по-прежнему относительно новая и, в основном, недокументированная, но мне удалось найти основные элементы для того, чтобы ее можно было превратить в конструкцию Gradle. По-видимому, трюк состоит в том, чтобы включить весь свой собственный код под src/main/jni
и удалить следующее в одной из ваших конфигураций (например, в блоке defaultConfig
):
ndk {
moduleName "mylib"
}
Проблема в том, что когда я пытаюсь создать свой проект, плагин ndk генерирует файл Android.mk, который включает в себя абсолютные пути к родному источнику. Это заставляет make
задыхаться, поскольку STILL считает пути относительными. В моем случае у меня есть простой проект библиотеки с 1 cpp source/header combo под src/main/jni
, и я использую этот 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.+'
}
Запуск сборки создает этот Android.mk в файле 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)
... который при запуске генерирует эту ошибку:
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.
... потому что абсолютные пути ошибочно преобразуются в относительные. Если я вручную отредактирую файл и изменим пути на относительные так:
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)
... Затем я получаю эту ошибку:
/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
Мой вопрос - что я могу сделать, чтобы исправить это? Я начал взламывать свою собственную поддержку <. W140 > для .aar-сборок, но потерялся, пытаясь выяснить, какая задача Gradle отвечает за генерацию .aar файла. (Документы Gradle, в то время как в изобилии, затрудняют поиск деталей конкретного API задачи Gradle.) У меня есть частично работающий gradle.build, который будет запускать ndk-build через строку cmd, сгенерировать .so, но я не могу понять, как (или даже если я должен) встроить .so внутри .aar. Я использую Android Studio 0.5.7 и Gradle 1.11. Я вытащил источник Gradle несколько месяцев назад, и именно так я понял, как встраивать файлы .so и gdbserver в обычный проект .apk, но эти правила, похоже, не применимы к проектам .aar. Кто-нибудь еще пытался это сделать? Где я могу найти ответы?