android - 如何将我的 .so 库复制到 Android 设备?

标签 android java-native-interface shared-libraries android-ndk

一句话总结:当我运行我的应用程序时,并不是所有的 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文件

bambuser_ffmpeg 中的 Android.mk 文件说:

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 文件在哪里?如何将它们发送到设备?

此外,显然,仅手动复制它们并不是我想要的解决方案。

最佳答案

在上传应用程序之前,您是否绝对确定所有库都在那里。是的,我看到您写道它们在那里,但是当您构建 jni 项目时,它会删除 libs 目录中的所有现有文件。因此,请在上传之前刷新以仔细检查。

关于android - 如何将我的 .so 库复制到 Android 设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5994278/

相关文章:

java - 是否有 RxJava 等效于 Handler.postDelayed(Runnable r, long delayMillis)

java - 如何在 JNI 中将 java 对象写入 jobject 数组?

c++ - Linux 共享库

android - ListPopupWindow菜单弹出动画方向从左到右

android - 如何在手机休眠时防止 Wifi 断开连接?

java - 在JNI中直接获取DirectByteBuffer地址的风险

c++ - nm 命令输出中的 '@@' 符号是什么意思?

shared-libraries - 在 pkg-config 中使用 Requires 与 Requires.private 时,链接过程有何不同?

android - ListView 导航就像在 android 联系人 View 中一样

java - 从 JNI 操作 ByteBuffer