2015-09-07 3 views
17

Я знаю, что есть ответы, связанные с этим, но они старые и устаревшие. Я получил Android Studio 1.3 и уже загрузил Android NDK. Когда я запускаю приложение, он сбой и дает findLibrary returned null в Logcat. Я понял, что это связано с отсутствием файла библиотеки .so (исправьте меня, если я ошибаюсь). Мой вопрос: Как создать файл .so в Android Studio?Создайте .so файл в Android Studio

То, что я -

  • Android Studio 1.3 Стабильная версия
  • Gradle 1,5
  • Android Экспериментальный плагин 0,2

Примечание - Если файл библиотеки .so имеет будет построен от Cygwin или CMD, скажите, пожалуйста, как это сделать.

+0

Вы могли сгенерировать файл .so с помощью студии 2.1? – Hunt

ответ

12

Есть несколько шагов, необходимых для подключения NDK к Android Studio. В настоящее время поддержка отмечена как экспериментальной и AS начинает связывать возможность загрузки NDK в среде IDE. По умолчанию AS использует общие Android.mk и Application.mk, когда источник и/или библиотеки размещаются в папке jni или jniLibs. Приведенные ниже инструкции переопределяют эти значения по умолчанию, чтобы обеспечить дополнительную возможность настройки.

Короче говоря, вам нужно:

  1. Создать параметр по умолчанию jni и jniLibs каталоги для источника и LIBS.
  2. Расскажите Android Studio, где найти ваше NDK строить цепь
  3. Расскажите Gradle, как собрать и где разместить ваш ЛИЭС
  4. Создать Android.mk файл указать здание и привязку заказ
  5. Создать какой-то источник

Создание каталогов

Внутри /app/src/main создать jni и jniLibs.

Update local.properties

Внутри файла local.properties, добавьте строку, подобную:

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

Update build.gradle

Это относится к уровню модуля , а не уровень приложения. Это гарантирует, что мы определили путь сборки на шаге выше и удалим возможность Android Studio автоматически вызывать ndk-build. Используйте следующий пример в качестве руководства.

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

Вам потребуется 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

Добавьте удивительный C/C++ исходный код для вашей библиотеки. Эти файлы будут стартовать в /app/src/main/jni и будут скомпилированы и скомпонованы, как указаны в вашем Android.mk

Примере файл

#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 

компилировать и запускать.

+1

Код «Gradle», который вы указали для старого Android-плагина. Новый «Экспериментальный плагин» имеет разный макет «Gradle». Не могли бы вы обновить свой код «Gradle»? Спасибо за ответ, хотя. – FadedCoder

+0

Ничего, отредактировал это с помощью нового кода «Gradle». – FadedCoder

+0

@AUnknownHacker Это не обязательно старое vs новое редактирование. Это более или менее, вы хотите использовать gradle или make-файл для ваших вещей. Кроме того, API 4 не будет использоваться для некоторых из этих троек, а также для Java v1.7. – nathansizemore

6

Более года спустя с Android Studio 2.2 и выше вы можете получить все это для вас бесплатно, просто выбрав «Включить поддержку C++» при создании нового проекта.

Для получения дополнительной информации посетите: https://developer.android.com/studio/projects/add-native-code.html.

+0

Да, после долгого, loooong времени, Android Studio наконец-то добавила полную рабочую поддержку NDK :) – FadedCoder

Смежные вопросы