2013-04-22 5 views
9

У меня есть андроид проект с структурой libs папок, как это:Почему не копируется libgnustl_shared.so из моего APK?

/libs 
    /armeabi 
    libfoo.so 
    libbar.so 
    libmystuff.so 
    libgnustl_shared.so 
    /armeabi-v7a 
    libfoo.so 
    libbar.so 

foo и bar являются сторонними библиотеками, mystuff моя собственная библиотека из отдельного андроида проекта JNI, который требует gnustl_shared, что из тех же JNI.

Когда я создаю свой проект в Eclipse, я могу просмотреть содержимое сгенерированного APK с помощью unzip -l, и это действительно показывает, что все эти файлы библиотеки были включены.

Однако после установки APK папка /data/data/com.myproject/lib не содержит libgnustl_shared.so, хотя имеются и другие библиотеки.

Это неизбежно приводит к следующей ошибке:

UnsatisfiedLinkError: Couldn't load gnustl_shared: findLibrary returned null 

В качестве проверки вменяемости, я побежал adb push ./libs/armeabi/libgnustl_shared.so /data/data/com.myproject/lib и достаточно уверенный, приложение запускается как и ожидалось.

Я ничего не вижу в журнале сборки или консоли Eclipse, что предполагает наличие каких-либо проблем при создании или установке приложения.

  • Что может помешать установке libgnustl_shared.so с моим приложением?
  • Где я могу узнать, что произойдет, когда APK установлен?

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

+0

дважды проверьте MainFest для операторов, включая всех LIBS. –

+0

@RobertRowntree - Не могли бы вы объяснить, что вы имеете в виду? Мне никогда не нужно было указывать библиотеки в AndroidManifest.xml для других проектов, если это то, о чем вы говорите. – namuol

+0

читайте здесь: http://developer.android.com/tools/projects/projects-cmdline.html#ReferencingLibraryProject –

ответ

0

Я думаю, что ваш libgnustl_shared.so потребность под /armeabi-v7a не под /armeabi

Пожалуйста, попробуйте скопировать libgnustl_shared.so в /armeabi-v7a

+0

Я тоже пробовал это, чтобы воспользоваться. – namuol

+0

Привет @namuol, если вы не смогли найти * libgnustl_shared.so * под '/ data/data/com.myproject/lib', значит, этот lib не будет упакован в ваш APK. – caopeng

+0

@namuol - ваш назначенный 'APP_ABI' в' Application.mk'? По умолчанию, 'APP_ABI' равен ** armeabi **, – caopeng

0

Look при ответе здесь: How to link any library in ndk application Проблема, скорее всего, в вашем файле Android.mk. У вас должна быть линия, подобная той, которая находится внизу:

include $(BUILD_SHARED_LIBRARY) 

Если нет, то вы не включаете свою общую библиотеку.

+0

Я использую эту точную строку в проекте JNI, где я получил 'libmystuff.so' и' libgnu_stl_shared.so'; проект, о котором я говорю в моем вопросе, не является проектом JNI, поэтому файл 'Android.mk' не требуется. – namuol

2

Я думаю, что в Android.mk файле вашего JNI проекта, скорее всего, когда вы строите libmystuff.so, вы ссылки libgnustl_shared.so как:

LOCAL_LDLIBS += -lgnustl_shared 

Может быть, вы можете попробовать добавить его как модуль (NDK работает действительно сосредоточены на модули), что-то вроде:

include $(CLEAR_VARS) 
LOCAL_MODULE := gnustl_shared 
LOCAL_SRC_FILES := libgnustl_shared.so 
include $(PREBUILT_SHARED_LIBRARY) 

и (в разделе вы строите libmystuff.так):

LOCAL_SHARED_LIBRARIES := gnustl_shared 

И проверить, если он наконец скопирован

+0

Спасибо. Мне не хватало строку 'LOCAL_SHARED_LIBRARIES: = gnustl_shared'. – Martin