Как включить C++ AAR-библиотеку с CMake и Gradle в Android Studio

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

Install

Install is easy, you just import our AAR library into your Android project >by the following steps:

Right-click your module -> new -> module -> Import .JAR/.AAR Package -> >select our Release/androidlibsvm-release.aar

After this, you should add the app dependency by:

Right-click your app module -> open module setting -> clieck your app -> >dependencies -> + -> module dependency -> 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})

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

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

Это очень похоже на android.googlesource.com/platform/ndk/+/master/docs/user/…, но если я все правильно читаю, minSdkVersion будет 23, а не 24, что, как я думал, не будет иметь этой проблемы. На каком устройстве вы это используете? Какая у него версия ОС?

Dan Albert 07.01.2019 22:25

Привет, спасибо за помощь. Ошибка возникает на lenovo Tab 10 с Android 6.0.1 и armabi-v7a. Тем временем я попробовал приложение на Huawai p20 lite моей подруги с Android 8 и arm64-v8a, и оно работало нормально, как и на любом эмуляторе, ведь теперь я почти уверен, что это не проблема, связанная с cmake. . Я подумываю о понижении версии своего планшета до леденцов или чего-то подобного, вот как я расстроен. Может быть, это поможет, кто знает.

Nils Krautkremer 07.01.2019 22:38

Убедитесь, что libjnilibsvm.so создан для правильного уровня API. Не знаю, как вы его создаете, поэтому не знаю, где вам нужно проверить, но убедитесь, что его minSdkVersion соответствует вашему. Похоже, он 24 или выше, что объясняет, почему он не работает на устройстве Android-23.

Dan Albert 07.01.2019 23:24

Честно говоря, я только что включил .aar yctung. Думаю, в его git-rep.-build.gradle указано minSdk = 16/22. Может ли это быть причиной этих ошибок, даже если приложение работает на эмуляторе Api 23?

Nils Krautkremer 08.01.2019 00:00

Эмулятор API 23 - это x86, а не arm (вероятно, большинство людей не используют эмуляторы arm, потому что они очень медленные). Это API для конкретной руки, который отсутствует.

Dan Albert 08.01.2019 07:41
1
5
1 249
0

Другие вопросы по теме