2015-09-07 13 views
17

Jestem świadomy, że istnieją odpowiedzi związane z tym, ale są stare i nieaktualne. Mam Androida Studio 1.3 i już pobrałem Androida NDK. Po uruchomieniu aplikacji ulega awarii i daje findLibrary returned null w Logcat. Rozumiem, że to nie z powodu pliku biblioteki .so (Popraw mnie jeśli się mylę). Moje pytanie brzmi - Jak wygenerować plik .so w Android Studio?Generowanie pliku .so w Androidzie Studio

Co mam -

  • Android Studio 1.3 wersja stabilna
  • Gradle 1,5
  • Android Experimental Plugin 0,2

Wskazówka - Jeśli plik biblioteki .so ma do zbudowania od Cygwin lub CMD, proszę powiedz mi, jak to zrobić.

+0

Czy byłeś w stanie wygenerować plik .so używając studio 2.1? – Hunt

Odpowiedz

12

Aby podłączyć urządzenie NDK do systemu Android Studio, należy wykonać kilka czynności. Obecnie wsparcie jest oznaczone jako eksperymentalna, a AS zaczyna pakować możliwość pobrania NDK w IDE. Domyślnie AS używa generycznych Android.mk i Application.mk, gdy źródło i/lub biblioteki są umieszczane w folderze jni lub jniLibs. Poniższe instrukcje zastępują te wartości domyślne, aby zapewnić większą zdolność dostosowywania.

Krótko mówiąc, trzeba będzie:

  1. utworzyć Wartość domyślna jni i jniLibs katalogi dla źródła i bibliotekami.
  2. Powiadom Android Studio, gdzie można znaleźć swoją NDK łańcuch build
  3. Powiedz Gradle jak skompilować i gdzie umieścić libs
  4. Utwórz plik Android.mk określić budowę i łączenie zamówień
  5. Tworzenie jakieś źródło

tworzyć katalogi

Wewnątrz /app/src/main utwórz katalog jni i .

Aktualizacja local.properties

Wewnątrz pliku local.properties, dodać linię podobną do:

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

Aktualizacja build.gradle

ten odnosi się do poziomu modułu , a nie poziomu aplikacji. Dzięki temu mamy zdefiniowaną ścieżkę budowania w powyższym kroku i usuwamy możliwość automatycznego wywoływania programu ndk-build przez system Android Studio. Poniższy przykład służy jako przewodnik.

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

Musisz plik Android.mk wewnątrz katalogu /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

Dodać trochę niesamowite C/C++ kod źródłowy dla twojej lib. Pliki te rozpoczną się w /app/src/main/jni i zostaną skompilowane i połączone w sposób określony w Android.mk

Przykładowy plik

#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 

skompilować i uruchomić.

+1

Podany kod 'Gradle' jest przeznaczony dla starej wtyczki Android. Nowa "Eksperymentalna wtyczka" ma inny układ 'Gradle'. Czy możesz zaktualizować swój kod 'Gradle'? Dzięki za odpowiedź. – FadedCoder

+0

Nieważne, zredagowano to za pomocą nowego kodu 'Gradle'. – FadedCoder

+0

@AnnknownHacker To niekoniecznie stara czy nowa edycja. Mniej więcej chcesz użyć gradle lub makefile dla swoich rzeczy. Ponadto, API 4 nie będzie budowany dla niektórych z tych trójek, ani z Java v1.7. – nathansizemore

Powiązane problemy