Подтвердить что ты не робот

Создайте .so файл в Android Studio

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

Что у меня -

  • Android Studio 1.3 Стабильная версия
  • Gradle 1.5
  • Android Experimental Plugin 0.2

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

4b9b3361

Ответ 1

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

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

  • Создайте каталоги по умолчанию jni и jniLibs для ваших источников и библиотек.
  • Сообщите Android Studio, где найти цепочку сборки NDK
  • Расскажите gradle, как скомпилировать и где разместить ваши библиотеки.
  • Создайте файл Android.mk, чтобы указать порядок построения и привязки
  • Создайте источник

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

Внутри /app/src/main создайте каталог jni и jniLibs.

Обновить local.properties

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

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

Обновить 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/С++ для вашей библиотеки. Эти файлы запустится в /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

Скомпилируйте и запустите.

Ответ 2

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

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