¿Cómo puedo copiar mis bibliotecas .so en el dispositivo Android?
Para resumir en una línea: No todos mis archivos libs/armeabi/*.so
se copian al dispositivo cuando ejecuto mi aplicación. Voy a tratar de explicar.
Estructura del Directorio
Estoy tratando de obtener ffmpeg en Android y por lo tanto tienen la siguiente estructura para el NDK:
- ¿Qué dispositivos Android admiten jni?
- No se puede asignar suficiente memoria en JNI
- JNI: Cómo obtener el tamaño jbyteArray
- ¿Cómo puedo manejar las llamadas a AudioTrack de jni sin estrellarse?
- CLI en DalvikVM falla en JNI lib
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
Archivos de Android.mk
El archivo bambuser_ffmpeg
dentro de bambuser_ffmpeg
dice:
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
El segundo archivo `Android.mk tiene lo siguiente:
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)
Salida
Por lo tanto, cuando ejecuto ./ndk-build
, recibo esta salida. Se ve bien, ¿verdad?
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
Problema
Cuando ejecute mi aplicación Android, intentará cargar libffmpeg.so
. Por supuesto, mi directorio local libs
contiene todas las bibliotecas necesarias, ya que fueron construidas / copiadas antes:
libs └── armeabi ├── libavcodec.so ├── libavcore.so ├── libavdevice.so ├── libavfilter.so ├── libavformat.so ├── libavutil.so ├── libffmpeg.so └── libswscale.so
Sin embargo, en el propio dispositivo , sólo hay mi archivo libffmpeg.so
. Reside en at.ac.univie.gameclient/lib/libffmpeg.so
y se copió allí automáticamente. ¿Dónde están los otros archivos .so
y cómo los llevo al dispositivo?
Además, sólo manualmente copiarlos no es mi solución deseada, obviamente.
- ¿Cómo empaquete los archivos .so en mi archivo .aar?
- Accede al GPS en Android desde C ++
- Uso de la biblioteca compartida existente (.so) en la aplicación de Android
- Android: Calling System.loadLibrary () hace que el proceso muera
- Detección de fugas de memoria nativas en el código JNI de Android
- Firma digital de una biblioteca compartida en Android
- ¿Puedo usar excepciones de C ++ en la biblioteca JNI en Android?
- Utilizar bibliotecas jni de 32 bits en android de 64 bits
¿Estás absolutamente seguro de que todas tus bibliotecas están allí antes de cargar la aplicación. Sí vi que escribió que están allí, pero cuando se construye el proyecto jni que elimina todos sus archivos existentes en libs dir. Por lo tanto, actualizar antes de subirlo sólo para comprobar.
- Tabla de Jacinto6 con Android: cómo construir un firmware de retrato?
- ¿Cómo crear wifi tethering Hotspot en Android Marshmallow?