web-dev-qa-db-fra.com

Générez un fichier .so dans Android Studio

Je suis conscient qu'il existe des réponses à ce sujet, mais elles sont anciennes et obsolètes. J'ai Android Studio 1.3 et déjà téléchargé Android NDK. Lorsque je lance une application, elle se bloque et donne findLibrary returned null dans Logcat. J'ai compris que c'était dû à aucun .so fichier de bibliothèque (corrigez-moi si je me trompe). Ma question est - Comment générer un fichier .so dans Android Studio?

Ce que j'ai -

  • Android Studio 1.3 version stable
  • Gradle 1.5
  • Plugin expérimental Android 0.2

Remarque - Si la bibliothèque .so le fichier doit être construit à partir de Cygwin ou CMD, veuillez me dire comment procéder.

20
FadedCoder

Il y a quelques étapes nécessaires pour connecter le NDK à Android Studio. Actuellement, le support est marqué comme experimental et AS commence à regrouper la possibilité de télécharger le NDK dans l'EDI. Par défaut, AS utilise un Android.mk et Application.mk générique lorsque la source et/ou les bibliothèques sont placées dans le jni ou jniLibs. Les instructions ci-dessous remplacent ces valeurs par défaut afin de fournir plus de possibilités de personnalisation.

En bref, vous devrez:

  1. Créez les répertoires par défaut jni et jniLibs pour votre source et vos bibliothèques.
  2. Dites à Android Studio où trouver votre chaîne de construction NDK
  3. Dites à Gradle comment compiler et où placer vos bibliothèques
  4. Créez un fichier Android.mk Pour spécifier l'ordre de construction et de liaison
  5. Créer une source

Créer des répertoires

Dans /app/src/main, Créez un répertoire jni et jniLibs.

Mettre à jour local.properties

Dans votre fichier local.properties, Ajoutez une ligne similaire à:

ndk.dir=/home/nathan/development/bin/Android-ndk-r10e

Mettre à jour build.gradle

Cela fait référence au niveau du module, pas au niveau de l'application. Cela garantit que nous avons défini le chemin de génération à l'étape ci-dessus et supprime la possibilité pour Android Studio d'appeler automatiquement ndk-build. Utilisez l'exemple suivant comme guide.

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

model {
Android {
    compileSdkVersion = 23
    buildToolsVersion = "23.0.0"

    defaultConfig.with {
        applicationId = "com.example.hellojni"
        minSdkVersion.apiLevel = 4
        targetSdkVersion.apiLevel = 23
    }
}

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

/*
 * native build settings
 */
Android.ndk {
    moduleName = "hello-jni"
    /*
     * Other ndk flags configurable here are
     * cppFlags += "-fno-rtti"
     * cppFlags += "-fno-exceptions"
     * ldLibs    = ["Android", "log"]
     * stl       = "system"
     */
}
Android.buildTypes {
    release {
        minifyEnabled = false
        proguardFiles  += file('proguard-rules.txt')
    }
}
Android.productFlavors {
    // for detailed abiFilter descriptions, refer to "Supported ABIs" @
    // https://developer.Android.com/ndk/guides/abis.html#sa
    create("arm") {
        ndk.abiFilters += "armeabi"
    }
    create("arm7") {
        ndk.abiFilters += "armeabi-v7a"
    }
    create("arm8") {
        ndk.abiFilters += "arm64-v8a"
    }
    create("x86") {
        ndk.abiFilters += "x86"
    }
    create("x86-64") {
        ndk.abiFilters += "x86_64"
    }
    create("mips") {
        ndk.abiFilters += "mips"
    }
    create("mips-64") {
        ndk.abiFilters += "mips64"
    }
    // To include all cpu architectures, leaves abiFilters empty
    create("all")
}
}

Android.mk

Vous aurez besoin d'un fichier Android.mk Dans le répertoire /app/src/main/jni

LOCAL_PATH := $(call my-dir)

# Builds a dylib out of test.cpp
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.cpp
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

test.cpp

Ajoutez du code source génial C/C++ pour votre lib. Ces fichiers commenceront dans /app/src/main/jni Et seront compilés et liés comme spécifié dans votre Android.mk

fichier d'exemple

#include <jni.h>
#include <Android/log.h>

static const char *SOME_TAG = "MyAwesomeTag";

extern "C"
{

void
Java_com_something_something_1Android_ClassName_some_fn(JNIEnv *env, jobject obj)
{
    __Android_log_print(Android_LOG_VERBOSE, SOME_TAG, "Hello from NDK :)");
}

} // End extern

Compilez et exécutez.

16
nathansizemore

Plus d'un an plus tard avec Android Studio 2.2 et supérieur, vous pouvez désormais faire tout cela gratuitement pour vous en sélectionnant simplement "Inclure le support C++" lors de la création d'un nouveau projet.

Pour plus d'informations, consultez: https://developer.Android.com/studio/projects/add-native-code.html .

9
Arthur