Я использую динамическую c функцию доставки Android, потому что openCV делает размер приложения слишком большим. Проблема в том, когда я пытаюсь загрузить opencv, используя SplitInstallHelper.loadLibrary(this, "opencv_java4")
. Я выдаю мне эту ошибку.
ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основное E AndroidRuntime: процесс: com.example.com, PID: 7470 E AndroidRuntime: java .lang.UnsatisfiedLinkError: ошибка dlopen: библиотека "libc ++ _ shared.so "не найдено E AndroidRuntime: at java .lang.Runtime.loadLibrary0 (время выполнения. java: 1016) E AndroidRuntime: at java .lang.System.loadLibrary (System. java: 1669) E AndroidRuntime: на com.google. android .play.core.splitinstall.SplitInstallHelper.loadLibrary (неизвестный источник: 0) E AndroidRuntime: на org.opencv.com.example.com.TempActivity.onResume (TempActivity.kt : 615) E AndroidRuntime: в android .app.Instrumentation.callActivityOnResume (Instrumentation. java: 1434) E AndroidRuntime: в android .app.Activity.performResume (Activity. java: 7304) E AndroidRuntime: в android .app.ActivityThread.performResumeActivity (ActivityThread. java: 3993) E AndroidRuntime: в android .app.ActivityThread.handleResumeActivity (ActivityThread. java: 4033) E AndroidRuntime: в android .app .servertransaction.ResumeActiv ityItem.execute (ResumeActivityItem. java: 51) E AndroidRuntime: в android .app.servertransaction.TransactionExecutor.executeLifecycleState (TransactionExecutor. java: 145) E AndroidRuntime: в android .app.servertransaction.TransactionExecutor. execute (TransactionExecutor. java: 70) E AndroidRuntime: в android .app.ActivityThread $ H.handleMessage (ActivityThread. java: 1977) E AndroidRuntime: в android .os.Handler.dispatchMessage (Обработчик. java: 106) E AndroidRuntime: в android .os.Looper.l oop (Looper. java: 193) E AndroidRuntime: в android .app.ActivityThread.main (ActivityThread. java : 6923) E AndroidRuntime: в java .lang.reflect.Method.invoke (собственный метод) E AndroidRuntime: в com. android .internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit. java: 493) E AndroidRuntime: at com. android .internal.os.ZygoteInit.main (ZygoteInit. java: 870)
My onCreate выглядит следующим образом
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
try {
SplitInstallHelper.loadLibrary(this, "opencv_java4")
} catch (exception: Exception) {
exception.printStackTrace()
}
Затем загрузка библиотеки openCV внутри onResume * 10 17 *
override fun onResume() {
super.onResume()
if (!OpenCVLoader.initDebug()) {
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, mLoaderCallback)
} else {
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS)
}
}
Это мой defaultConfig в Gradle для openCV модуля.
defaultConfig {
externalNativeBuild {
cmake {
cppFlags ""
arguments "-DANDROID_ARM_NEON=TRUE",'-DANDROID_STL=c++_shared'
targets "opencv_jni_shared"
}
}
ndk {
abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
}
}
Некоторый ресурс попросил внести изменения в CMakeList.txt & пустышка. cpp файла
CmakeList.txt
cmake_minimum_required(VERSION 3.6)
# dummy target to bring libc++_shared.so into packages
add_library(opencv_jni_shared STATIC dummy.cpp)
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log)
target_link_libraries( # Specifies the target library.
opencv_jni_shared
# Links the target library to the log library
# included in the NDK.
${log-lib})
пустышка. cpp
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
whatever(
JNIEnv *env,
jobject /* this */){
std::string hello = "Hello";
return env->NewStringUTF(hello.c_str());
};