Я пытаюсь использовать нативную библиотеку opencv в андроид-студийном проекте. Я получаю сообщение об ошибке по неопределенной ссылке для функции knnMatch.
Я добавил openCVLibrary в свой проект и успешно использовал другие функции openCV.
ОБНОВЛЕНИЕ: Добавить мои файлы компиляции
Мое приложение build.gradle:
apply plugin: 'com.android.application'
//
android {
compileSdkVersion 27
buildToolsVersion '27.0.3'
//
defaultConfig {
minSdkVersion 21
targetSdkVersion 27
...
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang" , "-DANDROID_STL=c++_static","-DCMAKE_BUILD_TYPE=Release", "-DANDROID_CPP_FEATURES=rtti exceptions"cppFlags "-D__STDC_FORMAT_MACROS" , '-O3','-fopenmp','-fsigned-char', "-std=c++14", "-frtti", "-fexceptions", "-mfloat-abi=softfp", "-Wall"}
ndk {
abiFilters 'arm64-v8a'
}
}
}
//
externalNativeBuild {
cmake {
path "CMakeLists.txt"}
}
...
}
//
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
implementation project(':openCVLibrary340') //Module
}
Мой CMakeList.txt:
cmake_minimum_required(VERSION 3.4.1)
#
include_directories(/.../OpenCV-android-sdk/sdk/native/jni/include)
add_library( libopencv SHARED IMPORTED )
set_target_properties(libopencv PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)
#
FILE(GLOB CPP_SRC
"src/main/cpp/*.c""src/main/cpp/*.h""src/main/cpp/*.cpp""src/main/cpp/*.hpp")
#
add_library( myLib SHARED ${CPP_SRC} )
#
find_library( log-lib log )
#
target_link_libraries( myLib libopencv ${log-lib} )
target_link_libraries( myLib android log EGL GLESv2 )
В моем jniLibs -> arm64-v8a
У меня есть эти cv библиотеки:
libopencv_calib3d.a, libopencv_core.a, libopencv_dnn.a,
libopencv_features2d.a libopencv_flann.a, libopencv_highgui.a,
libopencv_imgcodecs.a, libopencv_imgproc.a, libopencv_java3.so,
libopencv_ml.a, libopencv_objdetect.a, libopencv_photo.a,
libopencv_shape.a libopencv_stitching.a, libopencv_superres.a,
libopencv_video.a, libopencv_videoio.a, libopencv_videostab.a
Как я уже сказал, другие функции cv, такие как cv::solvePnP
отлично работает
только KnnMatch
бросить неопределенный.
ОБНОВЛЕНИЕ: если я удалю -DANDROID_STL=c++_shared
Я могу собрать knnMatch
но мне это нужно, какие-либо предложения?
Привет Это явно ошибка связи. При компиляции кода метод, на который вы ссылаетесь из внешней библиотеки, не может быть включен или связан. Во время компиляции компоновщик ищет ссылку на этот метод во всех библиотеках, и если он не может найти определение этого метода в библиотеках или файлах obj, он выдаст вам эту ошибку. Если вы используете make-файл, проверьте, правильно ли вы добавили в него нужную библиотеку. Также проверьте, установлена ли в библиотеке переменная окружения path или нет.
Других решений пока нет …