Как включить C ++ AAR-библиотеку с CMake и Gradle в Android Studio - PullRequest
0 голосов
/ 04 января 2019

Я хочу включить в свой проект yctung's AndroidLibSVM, поэтому я следовал его инструкциям, чтобы импортировать .AAR и установить зависимости.

Установить

Установка проста, вы просто импортируете нашу библиотеку AAR в свой проект Android>, выполнив следующие действия:

Щелкните правой кнопкой мыши по вашему модулю -> новый -> модуль -> Импортировать пакет .JAR / .AAR ->> выберите наш Release / androidlibsvm-release.aar

После этого вы должны добавить зависимость приложения:

Щелкните правой кнопкой мыши на модуле приложения -> открыть настройки модуля -> заблокировать приложение ->> зависимости -> + -> зависимость модуля -> androidlibsvm

Теперь я мог импортировать и работать с его библиотекой, как ожидалось, и Android Studio могла бы скомпилировать код и собрать без каких-либо ошибок. Приложение работает нормально на эмулируемом устройстве, однако оно вылетает на моем физическом устройстве, как только оно пытается запустить часть кода, ссылающуюся на библиотеку yctung, со следующей ошибкой:

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__aeabi_memcpy" referenced by "/data/app/com.krautkremer.nils.mymirror-1/lib/arm/libjnilibsvm.so"

Ссылаясь на этот SO-вопрос, ошибка может быть вызвана неправильными настройками Cmake / Gradle. Если я правильно понял, Тунг использовал ndk-build для своего проекта, в то время как я собираюсь с Cmake. Поэтому в моем случае его инструкций по установке библиотеки может быть недостаточно. На самом деле, я не внес никаких изменений в CMakeLists.txt по умолчанию, который, как я понимаю, имеет решающее значение для Cmake. Я попытался добавить несколько строк в файл build.gradle и / или файл CmakeLists, поскольку они обычно предлагаются в SO-решениях, но безуспешно, но я должен признать, что я действительно не понимаю, что я делаю, даже после того, как Чтение официального гида . Я немного заблудился здесь, так как я едва знаю разницу между ndk-build и Cmake, не говоря уже о том, как правильно их настроить или даже если это необходимо в этом случае. Я был бы очень признателен, если бы кто-нибудь мог объяснить мне, как я могу правильно интегрировать AndroidLibSVM в мой проект, какие изменения я должен внести в мои файлы gradle / cmake и как мне настроить мои каталоги (в случае это является частью ответа). Все, что я скачал до сих пор, это .aar, который действительно содержит несколько файлов .so, но я не понимаю, где их разместить.

Теперь, это мой build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 28


defaultConfig {
    applicationId "com.krautkremer.nils.mymirror"
    minSdkVersion 23
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    externalNativeBuild {
        cmake {
            cppFlags ""
            arguments "-DANDROID_PLATFORM=android-23"
        }
    }

}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
packagingOptions {
    //exclude 'META-INF/proguard/androidx-annotations.pro'
}

externalNativeBuild {
    cmake {
        path "CMakeLists.txt"


    }
}
}

dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'
implementation 'androidx.media:media:1.1.0-alpha01'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
implementation 'com.google.android.material:material:1.1.0-alpha01'
implementation 'androidx.annotation:annotation:1.0.1'
implementation 'com.google.firebase:firebase-core:16.0.6'
implementation 'com.google.firebase:firebase-ml-vision:18.0.2'
implementation 'com.google.firebase:firebase-ml-common:16.1.6'
implementation 'com.google.firebase:firebase-ml-vision-face-model:17.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1-alpha01'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1-alpha01'
implementation project(':androidlibsvm-release')
}
apply plugin: 'com.google.gms.google-services'

а это мой CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)


add_library( 
    native-lib

    SHARED

    src/main/cpp/native-lib.cpp)


find_library( 
    log-lib
    log)

target_link_libraries( 
    native-lib

    ${log-lib})

Это - моя структура каталогов.

Заранее спасибо. Если вам нужно больше, чтобы помочь мне, я был бы рад помочь вам помочь;)

...