【发布时间】:2011-08-25 01:20:26
【问题描述】:
总而言之:当我运行我的应用程序时,并非所有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 文件在哪里?如何将它们发送到设备?
另外,显然,只是手动复制它们不是我想要的解决方案。
【问题讨论】:
-
@unwind 好吧,必须从格式错误的问题中脱颖而出:P
-
在上传应用程序之前,您确定所有库都在那里。是的,我看到您写道它们在那里,但是当您构建 jni 项目时,它会删除 libs 目录中的所有现有文件。所以在上传之前刷新只是为了仔细检查。
-
您是如何获得这些 .so 文件的?我正在尝试使用带有 cygwin-1.7.9 的 windows 编译 ffmpeg,我不知道如何从 ffmpeg 生成 .so 文件?请帮忙。
-
@Ewoks 我没有正确构建 JNI 项目。我构建并刷新了整个东西,所有的 .so 文件都在那里,正如预期的那样。
标签: android java-native-interface shared-libraries android-ndk