2013-09-24 2 views
4

Итак, похоже, что есть много проблем, таких как мой, но не уверен, что какие-либо из них связаны с моей проблемой. ОК. У меня есть проект Android, который использует SDK в качестве справочной библиотеки. SDK содержит C++, поэтому я использую библиотеку android-ndk-r9. SDK, который я упоминаю в своем проекте Android, представляет собой JNI-библиотеку (Oooooo - scary stuff). О да, не дай мне забыть упомянуть армеави-v7a (который, кажется, еще один страшный предмет). Моя ошибка возникает, когда эта линия выполнена:AndroidRuntime Caused by: java.lang.unsatisfiedLinkError: Не удалось загрузить tfp_jni: findLibrary возвращается null

System.loadLibrary("tfp_jni"); 

tfp_jni действительно файл libtfp_jni.so в папке armeabi-v7a в ЛИЭС папке моей библиотеки SDK проекта. Этот проект библиотеки SDK содержит файл Android.mk. Я не думаю, что код туда попадает. Но вот содержание этого .mk файла:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := tfp-prebuilt 
LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libtfp_jni.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include 
include $(PREBUILT_SHARED_LIBRARY) 

Тогда в моем Android проекта, у меня есть JNI папку, содержащую Android.mk и Application.mk. Вот содержание:

Android.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

OPENCV_INSTALL_MODULES:=on 
OPENCV_INSTALL_CAMERA:=off 

include $(INNERID_ANDROID_ROOT)/Android.mk 
include $(OPENCV_ANDROID_ROOT)/sdk/native/jni/OpenCV.mk 

Application.mk

APP_STL := gnustl_static 
APP_CPPFLAGS := -frtti -fexceptions 
APP_ABI := armeabi-v7a 
APP_PLATFORM := android-14 

Переменные окружения

Environment Variables

Дорожки и символы - Включает

Paths and Symbols - Includes

Все остальные вкладки являются пустыми для источника Место и вывода Место, в котором отображается папка проекта, за исключением.

проект Android & Предпочтения

Android project & Preferences

Я пробовал различные другие ответы от подобных вопросов на Stackoverflow без успеха. Пожалуйста, дайте мне знать, если есть что-то еще, что вам нужно увидеть, и я предоставлю дополнительную информацию как можно скорее.

Спасибо.

---------------------------------------------- ----------- Новое изображение ----------------------------------- --------------

Imgur

Correction! Apk находится в папке project/bin для проверки-демонстрации. Реферированная библиотека tfp_java.jar - это проект библиотеки SDK. Из Finder вы можете видеть, что файл .so находится в libs. Помогает ли это?

+1

.apk-файлы - это просто причудливые zip-файлы, поэтому откройте файл .apk с помощью zip-файла и посмотрите, делает ли файл .so его в apk. –

+0

@ChrisStratton - Извините! Где апк? – Patricia

+0

Из памяти, возможно, в папке bin/под вашим деревом проектов, если вы недавно сделали сборку для установки. –

ответ

9

Количество вещей должно произойти для связи работать

  1. Уроженец библиотека должна быть составлена ​​на .so файла для соответствующего ABI (ы) - это как правило, осуществляется с помощью ndk-build сценария/пакетный файл, хотя он также может быть выполнен с использованием созданной отдельной привязки. Проекты IDE могут захотеть настроить выполнение этого как шаг пользовательской сборки.

  2. Собственная библиотека должна быть упакована в приложение .apk. Если он был создан из jni/папки в каталоге проекта приложения, то ndk-build, вероятно, скопировал его в соответствующий подкаталог ABI в каталоге libs /. Однако, если родная библиотека принадлежит к отдельной библиотеке Android, могут потребоваться дополнительные шаги. В частности, a .so не может быть получена системой сборки из библиотеки .jar, и поэтому один из связанных с библиотечным кодом должен быть либо явно скопирован в папку libs/client клиентского проекта, либо найден путем ссылки на проект библиотеки дерево каталогов (не одинокий .jar), который включает его.

  3. Установщик на устройстве должен решить, что один из .so-файлов, содержащихся в .apk, подходит для ABI (архитектуры) устройства и скопируйте его из .apk в каталог установки для использования.

  4. Имена функций связи jni-функций (ниже по потоку от любого имени компилятора) должны соответствовать именам, которые ищет виртуальная машина. Как правило, проблемы возникают из-за неправильной кодировки полного имени класса java в имени встроенной функции. Инструмент javah призван помочь избежать таких ошибок, хотя с осторожностью это можно сделать вручную.

Каждое из этих шагов представляет собой потенциальный пробой, поэтому отладку неудовлетворенная ссылку можно подойти, пытаясь найти первый этап, на котором .so файл идет отсутствует.

+0

Мои файлы .so в libs, что мне делать. Я не мог понять, пожалуйста, помогите. –

Смежные вопросы