NDK Dev в проекте библиотеки Android с Gradle и Android Studio

Я пытался взломать проект под управлением 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. Кто-нибудь еще пытался это сделать? Где я могу найти ответы?

Ответ 1

Я понял это наконец! Вы должны использовать последнюю версию NDK для новой поддержки Gradle NDK. Мои local.properties(и мой ~/.bashrc) указывали на андроид-ndk-r8e, чтобы работать со сломанной поддержкой gdb-сервера в android-ndk-r9d, однако, когда я обновился до android-ndk-r9d, моя сборка Gradle началась работать без дополнительных хаков. Таким образом, приведенный выше пример работает до тех пор, пока ваши local.properties указывают на версию 9b + NDK.