Comment construire une application basée sur Android Gradle avec NDK uniquement pour la cible ARM?

j'ai un .donc, fichier du vendeur qui ne supporte que "arm". Actuellement, il fonctionne parfaitement bien pour mon application Android. D'une façon ou d'une autre, je veux séparer l'implémentation en utilisant Android Studio module, de sorte que je peux exporter le module en Jar en suivant ce tutoriel https://www.youtube.com/watch?v=1i4I-Nph-Cw .

quand j'exporte le pot, le processus de compilation retourne une erreur

/Users/zoom/android-ndk-r9d/toolchains/mipsel-linux-android-4.8/prebuilt/darwin-x86_64/bin/../lib/gcc/mipsel-linux-android/4.8/../../../../mipsel-linux-android/bin/ld: skipping incompatible src/main/jniLibs/armeabi/libremote_client.so when searching for -lremote_client
/Users/zoom/android-ndk-r9d/toolchains/mipsel-linux-android-4.8/prebuilt/darwin-x86_64/bin/../lib/gcc/mipsel-linux-android/4.8/../../../../mipsel-linux-android/bin/ld: cannot find -lremote_client
collect2: error: ld returned 1 exit status

:app:linkMipsDebugRemoteDesktopSharedLibrary FAILED

FAILURE: Build failed with an exception.

les journaux disent que gradle était j'ai essayé de construire avec mips mais j'ai échoué à cause de l'incompatibilité de la bibliothèque, puisque je n'ai que la bibliothèque arm. Ma question comment sauter le processus de construction contre mips? Ou est-il possible de ne cibler que L'architecture ARM?

"1519110920 de construire".Grad

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

model {
android {
    compileSdkVersion = 23
    buildToolsVersion = "22.0.1"

    defaultConfig.with {
        //applicationId = "com.test.remote"
        minSdkVersion.apiLevel = 19
        targetSdkVersion.apiLevel = 21
        //versionCode = 1
        //versionName = "1.0"
    }

}

android.ndk {
    moduleName = "remote_client"
    //CFlags += "-DANDROID_NDK"
    CFlags += ['-std=c99', '-fstrict-aliasing']
    ldLibs += ["log", "remoted_client"]
}

android.buildTypes {
    release {

        minifyEnabled = false
        proguardFiles += file('proguard-rules.pro')
    }
}

android.sources {
    main {
        jni {
            source {
                srcDir 'src/main/jni'
            }
        }
        jniLibs {
            source {
                srcDir 'src/main/jniLibs'
            }
        }
    }
}

android.productFlavors {
    create("arm") {
        ndk.with {
            abiFilters += "armeabi"
            ldFlags += "-Lsrc/main/jniLibs/armeabi"
        }
    }
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1'
}


task clearJar(type: Delete) {
delete 'mylib.jar'
}

task makeJar(type: Copy) {
   from('build/intermediates/bundles/release/')
   into('release/')
   include('classes.jar')
   rename ('classes.jar', 'mylib.jar')
}

makeJar.dependsOn(clearJar, build)
2

3 réponses

testé sur Android SDK 26, NDK 15.2

dans le fichier app/build.gradle :

android {
    defaultConfig {
        ndk {
            abiFilters 'arm64-v8a'

ne sera construit que pour arm64-v8a , ou pour toutes les cibles ARM actuellement non dépréciées:

abiFilters 'arm64-v8a', 'armeabi-v7a'

liste ABI actuellement à: https://developer.android.com/ndk/guides/abis.html

testé sur Ubuntu 17.10 host, Android Studio 3, Android SDK 26, NDK 15.2, et un appareil Android 6.0.1.

Exemple de projet sur GitHub .

1

déplacez simplement abiFilters dans android.ndk "151940920 de la section":

model {
    android.ndk {
        moduleName = "remote_client"
        CFlags += ['-std=c99', '-fstrict-aliasing']
        ldLibs += ["log", "remoted_client"]
        abiFilters = ['armeabi']
    }
}
0
répondu Alex Cohn 2015-10-22 14:29:08

enfin je l'ai fait. Voici un exemple pour désactiver une tâche spécifique. Ajoutez cette ligne sur votre construction.Grad

tasks.getByPath(":app:linkMipsDebugRemoteDesktopSharedLibrary").enabled = false
0
répondu zoom 2015-10-27 22:46:12