2015-09-07 22 views
17

Sono consapevole che ci sono risposte correlate a questo, ma sono obsolete e obsolete. Ho ottenuto Android Studio 1.3 e ho già scaricato Android NDK. Quando eseguo un'applicazione, si blocca e fornisce findLibrary returned null in Logcat. Ho capito che questo non era dovuto al file della libreria .so (correggimi se ho torto). La mia domanda è - Come posso generare un file .so in Android Studio?Genera file .so in Android Studio

Quello che ho -

  • Studio Android 1.3 versione stabile
  • Gradle Plugin 1.5
  • Sperimentale Android 0,2

Avviso - Se il file di libreria .so ha da costruire da Cygwin o CMD, per favore dimmi come si fa.

+0

sei riuscito a generare file .so utilizzando lo studio 2.1? – Hunt

risposta

12

Sono necessari alcuni passaggi per collegare NDK a Android Studio. Attualmente, il supporto è contrassegnato come sperimentale e AS sta iniziando a offrire la possibilità di scaricare l'NDK all'interno dell'IDE. Per impostazione predefinita, AS utilizza un valore generico Android.mk e Application.mk quando la posta e/o le librerie sono posizionate nella cartella jni o jniLibs. Le istruzioni sottostanti sovrascrivono quelle predefinite al fine di fornire più capacità di personalizzazione.

In breve, è necessario:

  1. Creare il default jni e jniLibs directory per la vostra sorgente e librerie.
  2. Dillo Android Studio dove trovare la tua NDK catena accumulo
  3. Dillo Gradle come compilare e dove posizionare i vostri librerie
  4. Creare un file Android.mk per specificare costruzione e il collegamento ordine
  5. Crea qualche fonte

Crea directory

All'interno di /app/src/main creare una directory jni e jniLibs.

Aggiornamento local.properties

Dentro il file local.properties, aggiungere una linea simile a:

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

Aggiornamento build.gradle

Questo si riferisce al livello di modulo , non il livello di applicazione. Ciò garantisce che abbiamo definito il percorso di generazione nel passaggio precedente e rimuove la possibilità per Android Studio di richiamare automaticamente ndk-build. Utilizzare il seguente esempio come guida.

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

Avrete bisogno di un file all'interno della directory Android.mk/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

Aggiungete un po 'impressionante C/C++ di codice sorgente per la tua lib Questi file inizieranno nel /app/src/main/jni e saranno compilato e collegato, come specificato nella Android.mk

file di esempio

#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 

compilare ed eseguire.

+1

Il codice 'Gradle' che hai dato è per il vecchio plugin Android. Il nuovo 'plugin sperimentale' ha un diverso layout' Gradle'. Puoi aggiornare il tuo codice 'Gradle'? Grazie per la risposta però. – FadedCoder

+0

Non importa, lo ha modificato con il nuovo codice 'Gradle'. – FadedCoder

+0

@AUnknownHacker Non è necessariamente una modifica vecchia o nuova. È più o meno che vuoi usare gradle o makefile per le tue cose. Inoltre, l'API 4 non creerà per alcuni di questi tripli, né con Java v1.7. – nathansizemore

6

Più di un anno dopo con Android Studio 2.2 e versioni successive, ora è possibile ottenere tutto ciò gratuitamente gratuitamente selezionando "Includi supporto C++" durante la creazione di un nuovo progetto.

Per ulteriori informazioni: https://developer.android.com/studio/projects/add-native-code.html.

+0

Sì, dopo un lungo intervallo di tempo, Android Studio ha finalmente aggiunto il pieno supporto operativo per NDK :) – FadedCoder

Problemi correlati