Отладка NDK с gradle -экспериментальным плагином

Я пытаюсь добавить собственную отладку в проект, который является проектом Android Studio NDK. Раньше я просто использовал gradle, чтобы запустить оболочку script, которая построила NDK lib. Теперь я пытаюсь перейти к использованию gradle -experimental плагина.

Я подсчитал сеть за то, что мало информации есть (в основном здесь Сайт Android Tools - gradle Экспериментальный), об использовании gradle -experimental с NDK, и я собрал этот файл build.gradle, который использует предварительную поддержку NDK для создания встроенной сборки NDK с сборкой Java.

Наконец, получив это вместе с битами и частями информации, мне удалось получить часть NDK, но теперь он не может включить файл httpmime-4.4-beta1.jar, который явно включен в зависимости, и Я пробовал много разных перестановок, например:

compile files("libs/httpmime-4.4.jar")

Но, несмотря на это, ошибки для отсутствующих символов из файла Jar все еще появляются.

build.gradle source

    apply plugin: 'com.android.model.application'

    String APP_PACKAGE_NAME = 'com.obfuscated.app',
           VERSION_NAME = '3.0',
           TOOLS_VERSION = '23.0.2'

    int VERSION_CODE = 15,
        MIN_SDK_VERSION = 13,
        TARGET_SDK_VERSION = 19,
        COMPILE_SDK_VERSION = 23

    model {
        repositories {
            libs(PrebuiltLibraries) {
                // prebuilt binaries mirroring Android.mk
                libstuff {
                    headers.srcDirs.add(file("jni/stuff/include/stuff"))
                    binaries.withType(SharedLibraryBinary) {
                        sharedLibraryFile = file("jni/stuff/lib/libstuff.so")
                    }
                }
                // ...several more of these actually exist in build.gradle and are working
                cares {
                    headers.srcDirs.add(file("jni/c-ares/include"))
                    binaries.withType(SharedLibraryBinary) { 
                        // StaticLibraryBinary and staticLibraryFile doesnt work despite sample code, at least not for com.android.tools.build:gradle-experimental:0.6.0-alpha5, this builds even though its a static-lib
                        sharedLibraryFile = file("jni/c-ares/lib/libcaresARM.a")
                    }
                }
            }
        }
        android {
            compileSdkVersion = COMPILE_SDK_VERSION
            buildToolsVersion = TOOLS_VERSION

            defaultConfig.with {
                applicationId = APP_PACKAGE_NAME
                minSdkVersion.apiLevel = MIN_SDK_VERSION
                targetSdkVersion.apiLevel = TARGET_SDK_VERSION
                versionCode = VERSION_CODE
                versionName = VERSION_NAME

                buildConfigFields {
                    create() {
                        type "int"
                        name "VALUE"
                        value "1"
                    }
                }

                compileOptions.with {
                    sourceCompatibility = JavaVersion.VERSION_1_7
                    targetCompatibility = JavaVersion.VERSION_1_7
                }
            }

            signingConfigs {
                create("appRelease") {
                    storeFile file('sign.jks')
                    storePassword '...'
                    keyAlias '...'
                    keyPassword '...'
                    storeType "jks"
                }
            }
        } // end android

        android.lintOptions {
            abortOnError = false
        }

        android.packagingOptions {
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/services/javax.annotation.processing.Processor'
        }

        android.ndk {
            moduleName = "native"
            toolchain "clang"
            toolchainVersion "3.5"
            platformVersion = MIN_SDK_VERSION

            ldLibs.addAll('atomic', 'android', 'log', 'OpenSLES')
            abiFilters.addAll(["armeabi", "armeabi-v7a"])
            CFlags.addAll(["-mfloat-abi=softfp", "-mfpu=neon", "-O3", "-DCARES_STATICLIB", "-Wno-c++11-long-long"])
            cppFlags.addAll(["-I${file("jni")}".toString(),
                             "-I${file("jni/c-ares/include")}".toString(),
                             "-I${file("jni/coffeecatch")}".toString()])
            stl = "stlport_shared"
        }

        android.sources {
            main {
                jniLibs {
                    dependencies {

                    }
                }
                jni {
                    dependencies {
                        library "libstuff"
                        library "cares"
                        // ... 
                    }
                    source {
                        srcDir "jni"
                    }
                }
                // java {
                    // dependencies {
                    //     compile files("libs/httpmime-4.4-beta1.jar")
                    //     compile files("libs/FlurryAnalytics-5.1.0.jar")
                    // }
                // }
            }
        }

        android.buildTypes {
            debug {
                ndk.with {
                    debuggable = true
                }
            }
            release {
                minifyEnabled = false
                ndk.with {
                    debuggable = true
                }
            }
        }

        android.productFlavors {
            create("arm") {
                ndk.with {
                    abiFilters.add("armeabi-v7a")

                    ldLibs.addAll([file("jni/stuff/lib/libstuff.so").toString(),
                                            file("jni/c-ares/lib/libcaresARM.a").toString()])
                }
            }
            create("fat") {
                // compile and package all supported ABI
            }
        }

    } // end model

    repositories {
        mavenCentral()
    }

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])

        compile 'com.android.support:support-v4:23.+'
        compile 'com.android.support:appcompat-v7:23.+'
        compile 'com.android.support:support-v13:23.+'
        compile 'com.android.support:support-annotations:23.+'

        compile 'com.squareup:otto:1.3.8'
        compile 'com.github.machinarius:preferencefragment:0.1.1'
        compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
        compile 'com.fasterxml.jackson.core:jackson-core:2.5.+'
        compile 'com.fasterxml.jackson.core:jackson-annotations:2.5.+'
        compile 'com.fasterxml.jackson.core:jackson-databind:2.5.+'

        compile 'com.jakewharton:butterknife:7.0.1'
        compile 'com.google.guava:guava:19.0'
    }


    allprojects {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:deprecation" << "-Xlint:unchecked"
        }
    }

Из-за разочарования я переключился обратно на неэкспериментальную ветку, и даже со старым файлом build.gradle теперь не удается найти тот же самый файл jar. Так это проблема с Android Studio 2.0 Preview 6?

Кто-нибудь еще испытал это или получил решение? Было бы так удобно наконец-то отлаживать NDK прямо в Android Studio, и если бы не это последнее препятствие, я думаю, что я буду там.

За исключением повторной записи кода, который зависит от этого файла jar, я не понимаю, что еще попробовать. Я также открыт для предложений относительно формата моего файла build.gradle выше, поскольку документация для этих новых функций очень разрежена, и некоторые из образцов, похоже, уже устарели в отношении правильного синтаксиса.

ЧТО Я НЕ ПРОПУСТИТЬ?

Вы можете видеть, что шаги C и Cpp (mobile: compileNativeArmeabiDebugArmSharedLibraryNativeMainCpp) выполняются просто отлично, но затем Javac терпит неудачу. Этот подход к jar файлу работал отлично в течение последних двух лет или около того для http-mime lib из apache, поэтому я не понимаю, почему внезапно это проблема.

    :mobile:mergeArmDebugAndroidTestAssets
    :mobile:generateArmDebugAndroidTestResValues UP-TO-DATE
    :mobile:generateArmDebugAndroidTestResources
    :mobile:mergeArmDebugAndroidTestResources
    :mobile:processArmDebugAndroidTestResources
    :mobile:generateArmDebugAndroidTestSources
    :mobile:copyArmeabi-v7aDebugArmSharedLibraryStlSo
    :mobile:compileNativeArmeabi-v7aDebugArmSharedLibraryNativeMainC
    :mobile:compileNativeArmeabi-v7aDebugArmSharedLibraryNativeMainCpp
    :mobile:linkNativeArmeabi-v7aDebugArmSharedLibrary
    :mobile:nativeArmeabi-v7aDebugArmSharedLibrary
    :mobile:stripSymbolsArmeabi-v7aDebugArmSharedLibrary
    :mobile:ndkBuildArmeabi-v7aDebugArmSharedLibrary
    :mobile:ndkBuildArmeabi-v7aDebugArmStaticLibrary UP-TO-DATE
    :mobile:copyArmeabiDebugArmSharedLibraryStlSo
    :mobile:compileNativeArmeabiDebugArmSharedLibraryNativeMainC
    :mobile:compileNativeArmeabiDebugArmSharedLibraryNativeMainCpp
    :mobile:linkNativeArmeabiDebugArmSharedLibrary
    :mobile:nativeArmeabiDebugArmSharedLibrary
    :mobile:stripSymbolsArmeabiDebugArmSharedLibrary
    :mobile:ndkBuildArmeabiDebugArmSharedLibrary
    :mobile:ndkBuildArmeabiDebugArmStaticLibrary UP-TO-DATE
    :mobile:processAndroidArmDebugMainJniLibs UP-TO-DATE
    :mobile:androidArmDebug
    :mobile:compileArmDebugJavaWithJavac
    :mobile:compileArmDebugJavaWithJavac - is not incremental (e.g. outputs have changed, no previous execution, etc.).

Отсутствующие символы для Apache Jar Да, я знаю, что apache libs устарели, но это устаревший код, который должен работать, несмотря на этот факт, и будет обновляться в будущем.

Ответы

Ответ 1

Общий способ сделать включение, которое вы ищете, - это в зависимостях. compile fileTree (dir: 'libs', include: ['*.jar'])

Однако я не уверен, что это решит эту проблему. У меня всегда был успех с помещением jar в каталог libs в верхней части структуры каталогов. Если вам нужно иметь банку в другом месте, то это работает для меня:

repositories {
    flatDir {
        dirs '<relativePathToJar>'
    }
}

model { ... }

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}