2015-09-07 11 views
17

Ich bin mir bewusst, dass es Antworten dazu gibt, aber sie sind alt und veraltet. Ich habe Android Studio 1.3 und Android NDK bereits heruntergeladen. Wenn ich eine App starte, stürzt sie ab und gibt findLibrary returned null in Logcat. Ich fand heraus, dass dies keine .so Bibliotheksdatei war (Korrigieren Sie mich, wenn ich falsch liege). Meine Frage ist - Wie erstelle ich eine .so-Datei in Android Studio?Generate .so-Datei in Android Studio

Was ich habe -

  • Android Studio 1.3 Stable Version
  • Gradle 1.5
  • Android Experimental Plugin 0,2

Hinweis - Wenn die Bibliothek .so Datei hat von Cygwin odergebaut werden, bitte sag mir wie es geht.

+0

können Sie .so-Datei mit Studio 2.1 generieren? – Hunt

Antwort

12

Es sind ein paar Schritte erforderlich, um den NDK in Android Studio zu integrieren. Gegenwärtig ist die Unterstützung als experimentell markiert und AS beginnt, die Fähigkeit zum Herunterladen des NDK innerhalb der IDE zu bündeln. Standardmäßig verwendet AS einen generischen Code Android.mk und Application.mk, wenn die Quellen und/oder Bibliotheken im Ordner jni oder jniLibs abgelegt sind. Die folgenden Anweisungen überschreiben diese Standardeinstellungen, um mehr Anpassungsmöglichkeiten zu bieten.

Kurz gesagt, müssen Sie:

  1. Erstellen Sie den Standard jni und jniLibs Verzeichnisse für Ihre Quelle und Libs.
  2. Sagen Android Studio, wo Ihre NDK build Kette
  3. Sagen gradle zu finden, wie zu kompilieren und wo Ihre Libs
  4. platzieren
  5. Eine Android.mk Datei Gebäude zu spezifizieren und zu verknüpfen, um
  6. eine Quelle erstellen

erstellen Verzeichnisse

Innerhalb /app/src/main erstellen Sie ein jni und jniLibs Verzeichnis.

aktualisieren local.properties

In Ihrem local.properties Datei, fügen Sie eine Zeile ähnlich wie:

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

aktualisieren build.gradle

Dies bezieht sich auf Modulebene , nicht die Anwendungsebene. Dies stellt sicher, dass wir den Build-Pfad im obigen Schritt definiert haben und Android Studio nicht mehr in der Lage ist, ndk-build automatisch aufzurufen. Verwenden Sie das folgende Beispiel als Richtlinie.

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

Sie werden innerhalb des /app/src/main/jni Verzeichnis

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

Fügen Sie einige ehrfürchtige C/C++ Quellcode eine Android.mk Datei benötigen für deine lib. Diese Dateien werden in /app/src/main/jni beginnen und wird in Ihrem Android.mk

Beispieldatei

#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 

Kompilieren und Ausführen als angegeben kompiliert und verknüpft werden.

+1

Der 'Gradle' Code, den Sie angegeben haben, ist für das alte Android Plugin. Das neue 'Experimental Plugin' hat ein anderes' Gradle' Layout. Können Sie bitte Ihren 'Gradle' Code aktualisieren? Danke für die Antwort. – FadedCoder

+0

Macht nichts, editiert dies mit dem neuen 'Gradle' Code. – FadedCoder

+0

@AUnknownHacker Es ist nicht unbedingt eine alte vs neue Bearbeitung. Es ist mehr oder weniger wollen Sie Gradle oder ein Makefile für Ihre Sachen verwenden. Außerdem wird API 4 nicht für einige dieser Triples oder Java Version 1.7 erstellt. – nathansizemore

6

über ein Jahr später mit Android Studio 2.2 und höher, können Sie nun all dies für Sie kostenlos erledigen können einfach durch Auswahl von „Include C++ Support“, wenn ein neues Projekt anlegen.

Weitere Informationen finden Sie unter: https://developer.android.com/studio/projects/add-native-code.html.

+0

Ja, nach einer langen, langen Zeit hat Android Studio endlich volle Unterstützung für NDK hinzugefügt :) – FadedCoder