Я хочу включить 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})
Этот - моя структура каталогов.
Заранее спасибо. Если вам нужно больше, чтобы помочь мне, я буду рад помочь вам помочь мне;)
Привет, спасибо за помощь. Ошибка возникает на lenovo Tab 10 с Android 6.0.1 и armabi-v7a. Тем временем я попробовал приложение на Huawai p20 lite моей подруги с Android 8 и arm64-v8a, и оно работало нормально, как и на любом эмуляторе, ведь теперь я почти уверен, что это не проблема, связанная с cmake. . Я подумываю о понижении версии своего планшета до леденцов или чего-то подобного, вот как я расстроен. Может быть, это поможет, кто знает.
Убедитесь, что libjnilibsvm.so создан для правильного уровня API. Не знаю, как вы его создаете, поэтому не знаю, где вам нужно проверить, но убедитесь, что его minSdkVersion соответствует вашему. Похоже, он 24 или выше, что объясняет, почему он не работает на устройстве Android-23.
Честно говоря, я только что включил .aar yctung. Думаю, в его git-rep.-build.gradle указано minSdk = 16/22. Может ли это быть причиной этих ошибок, даже если приложение работает на эмуляторе Api 23?
Эмулятор API 23 - это x86, а не arm (вероятно, большинство людей не используют эмуляторы arm, потому что они очень медленные). Это API для конкретной руки, который отсутствует.
Это очень похоже на android.googlesource.com/platform/ndk/+/master/docs/user/…, но если я все правильно читаю, minSdkVersion будет 23, а не 24, что, как я думал, не будет иметь этой проблемы. На каком устройстве вы это используете? Какая у него версия ОС?