Android заставляет OpenCV 3.0 загружаться как 32-битная библиотека
Я пытаюсь заставить мое 64-битное устройство Android компилировать локальные 32-битные jniLibs, которые пока идут хорошо, но я вроде как натолкнулся на препятствие.
Я исследовал именно то, что пошло не так в течение нескольких дней и ковырялся здесь и там, но это текущая ошибка, которую я получаю:
java.lang.UnsatisfiedLinkError: сбой dlopen: "/data/app/org.opencv.engine-1/lib/arm64/libopencv_java3.so" является 64-разрядным вместо 32-разрядного
Что действительно многообещающе, учитывая, что 64-разрядное устройство признает, что оно должно компилировать 32-разрядную архитектуру, чего я добился, опуская arm64, x86_64 и mips64 в соответствии с этим ответом: Android JNI: 32-разрядная совместимость с 64- немного устройств?
Код инициализации, который я использую:
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
Итак, мои вопросы таковы:
Есть ли какой-нибудь способ отредактировать Abi, включенный в OpenCV 3.0, чтобы признать, что я желаю, чтобы 32-битная среда загружалась только после того, как устройство распознает, что оно должно искать только 32-битную среду?
Будет ли потеря функции хуже, если вернуться к OpenCV 2.4.11 (я знаю, что родная камера не работает должным образом на новой платформе)
Если ответ Abi верен, будет ли он соответствовать сборке gradle на уровне приложения, уровне проекта или каком-либо другом (вероятно, opencvlib) уровне? Эта часть прошла через мою голову, читая другой ответ.
1 ответ
Я установил его правильно, удалив все 64-битные библиотеки и сохранив все 32-битные библиотеки в папке jniLibs в app -> src -> main, но вместо вызова OpenCVLoader для загрузки библиотеки я просто сделал такой вызов:
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
}
else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
Который определяет, содержит ли ваше приложение уже локально файлы, которые иначе обрабатывает OpenCVManager. Еще одним преимуществом включения этих файлов в папку jniLibs является то, что приглашение на загрузку OpenCVManager больше не появляется, а ваше приложение по-прежнему имеет такие же функциональные возможности, как и пользователь.
Я полагаю, что краткое руководство по реализации всего локального было бы:
Файл -> Новый -> Модуль импорта -> Перейдите к OpenCV 3.1 -> SDK -> Java
Отредактируйте build.gradle нового модуля OpenCV в соответствии с файлом build.gradle вашего приложения.
Щелкните правой кнопкой мыши папку приложения вашего проекта -> Открыть Настройки модуля -> Зависимости -> + -> Зависимость модуля -> Выберите импортированную версию OpenCV
Создайте папку под app -> src -> main с именем jniLibs (как она вызывается по умолчанию, но может быть отредактирована через ваш файл build.gradle)
Перейдите в каталог OpenCV -> sdk -> native -> libs -> Скопируйте и вставьте armeabi, armeabi-v7a, mips во вновь созданную папку jniLibs
Затем инициализируйте, используя приведенный выше пример кода, и OpenCV должен быть загружен локально.