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 -
Remarque - Si la bibliothèque .so
le fichier doit être construit à partir de Cygwin
ou CMD
, veuillez me dire comment procéder.
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:
jni
et jniLibs
pour votre source et vos bibliothèques.Android.mk
Pour spécifier l'ordre de construction et de liaisonCré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.
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 .