Как мне скопировать мои библиотеки .so на устройство Android? - PullRequest
7 голосов
/ 13 мая 2011

Подводя итог в одной строке: Не все мои libs/armeabi/*.so файлы копируются на устройство при запуске приложения. Я постараюсь объяснить.

Структура каталогов

Я пытаюсь получить ffmpeg на Android и поэтому имею следующую структуру для NDK:

jni
├── Android.mk
├── bambuser_ffmpeg
│   ├── Android.mk
│   ├── libavcodec.so
│   ├── libavcore.so
│   ├── libavdevice.so
│   ├── libavfilter.so
│   ├── libavformat.so
│   ├── libavutil.so
│   └── libswscale.so
└── video
    ├── Android.mk
    ├── at_ac_univie_gameclient_video_VideoGLSurfaceView.c
    ├── at_ac_univie_gameclient_video_VideoGLSurfaceView.h
    └── at_ac_univie_gameclient_video_VideoGLSurfaceView_GLRenderer.h

Android.mk файлы

Файл Android.mk в bambuser_ffmpeg говорит:

include $(CLEAR_VARS)
LOCAL_MODULE := bambuser-libavcodec
LOCAL_SRC_FILES := libavcodec.so
include $(PREBUILT_SHARED_LIBRARY)
# and so on, for all of the above .so files

Второй файл Android.mk имеет следующее:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := ffmpeg
LOCAL_STATIC_LIBRARIES := bambuser-libavcodec bambuser-libavcore bambuser-libavdevice bambuser-libavfilter bambuser-libavformat bambuser-libavutil bambuser-libswscale
LOCAL_SRC_FILES := at_ac_univie_gameclient_video_VideoGLSurfaceView.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../bambuser_ffmpeg/
LOCAL_LDLIBS    := -L$(LOCAL_PATH)/../bambuser_ffmpeg -lavcodec -lavcore -lavdevice -lavfilter -lavformat -lavutil -lswscale -llog -lz -lGLESv1_CM

include $(BUILD_SHARED_LIBRARY)

выход

Итак, когда я запускаю ./ndk-build, я получаю этот вывод. Выглядит хорошо, не так ли?

Prebuilt       : libavcodec.so <= jni/bambuser_ffmpeg/
Install        : libavcodec.so => libs/armeabi/libavcodec.so
Prebuilt       : libavcore.so <= jni/bambuser_ffmpeg/
Install        : libavcore.so => libs/armeabi/libavcore.so
Prebuilt       : libavdevice.so <= jni/bambuser_ffmpeg/
Install        : libavdevice.so => libs/armeabi/libavdevice.so
Prebuilt       : libavfilter.so <= jni/bambuser_ffmpeg/
Install        : libavfilter.so => libs/armeabi/libavfilter.so
Prebuilt       : libavformat.so <= jni/bambuser_ffmpeg/
Install        : libavformat.so => libs/armeabi/libavformat.so
Prebuilt       : libavutil.so <= jni/bambuser_ffmpeg/
Install        : libavutil.so => libs/armeabi/libavutil.so
Prebuilt       : libswscale.so <= jni/bambuser_ffmpeg/
Install        : libswscale.so => libs/armeabi/libswscale.so
Install        : libffmpeg.so => libs/armeabi/libffmpeg.so

Проблема

Когда я запускаю приложение Android, оно пытается загрузить libffmpeg.so. Конечно, мой локальный каталог libs содержит все необходимые библиотеки, так как они были построены / скопированы ранее:

libs
└── armeabi
    ├── libavcodec.so
    ├── libavcore.so
    ├── libavdevice.so
    ├── libavfilter.so
    ├── libavformat.so
    ├── libavutil.so
    ├── libffmpeg.so
    └── libswscale.so

Однако на самом устройстве , есть только мой libffmpeg.so файл. Он находится в at.ac.univie.gameclient/lib/libffmpeg.so и был скопирован туда автоматически. Где находятся другие файлы .so и как их получить на устройство?

Кроме того, просто копировать их вручную, очевидно, не мое желаемое решение.

1 Ответ

1 голос
/ 13 мая 2011

Вы абсолютно уверены, что все ваши библиотеки есть перед загрузкой приложения. Да, я видел, что вы написали, что они есть, но когда вы создаете проект jni, он удаляет все ваши существующие файлы в libs dir. Так что обновите, прежде чем загружать его, просто чтобы проверить дважды.

...