3

我用监护人的脚本(这里)构建了 FFMPEG 。一切顺利,我有以下结构:

jni/
|-- Android.mk
|-- demo.c
|-- include/
|   |-- libavcodec/
|   |   |-- headers files
|   |-- libavdevice/
|   |   `-- avdevice.h
|   |-- libavfilter/
|   |   |-- headers files
|   |-- libavformat/
|   |   |-- headers files
|   |-- libavresample/
|   |   |-- headers files
|   |-- libavutil/
|   |   |-- headers files
|   |-- libpostproc/
|   |   |-- headers files
|   |-- libswresample/
|   |   |-- headers files
|   |-- libswscale/
|   |   |-- headers files
|   `-- sox.h
`-- lib/
    |-- libavcodec.a
    |-- libavdevice.a
    |-- libavfilter.a
    |-- libavformat.a
    |-- libavresample.a
    |-- libavutil.a
    |-- libpostproc.a
    |-- libsox.a
    |-- libswresample.a
    |-- libswscale.a
    |-- libx264.a

这是我的 Android.mk 文件:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

FFMPEG_LIBS := $(addprefix lib/, \
 libavformat.a \
 libavcodec.a \
 libpostproc.a \
 libswscale.a \
 libavutil.a \
 x264.a )

LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_SRC_FILES := demo.c
LOCAL_LDLIBS := -llog
LOCAL_STATIC_LIBRARY := $(FFMPEG_LIBS)
LOCAL_MODULE := demo
include $(BUILD_SHARED_LIBRARY)

还有我的 demo.c 文件:

#include <jni.h>

#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavformat/avio.h>
#include <libswscale/swscale.h>
#include <libavutil/avstring.h>

JNIEXPORT jint JNICALL Java_com_example_ffmpeg_guardian_MainActivity_logFileInfo(JNIEnv *env, jclass this, jstring filename)
{
    av_register_all();

    AVFormatContext *pFormatCtx;
    const jbyte *str;
    str = (*env)->GetStringUTFChars(env, filename, NULL);

    if(avformat_open_input(&pFormatCtx, str, NULL, NULL)!=0)
        return 1;
    else
       return 2;

    return 0;
}

问题是当我尝试使用 NDK (r8) 进行编译时,我收到了这条消息:

Compile thumb  : demo <= demo.c
SharedLibrary  : libdemo.so
demo.o: In function `Java_com_example_ffmpeg_guardian_MainActivity_logFileInfo':
demo.c:11: undefined reference to `av_register_all'
demo.c:17: undefined reference to `avformat_open_input'
collect2: ld returned 1 exit status
make: *** [ffmpeg-guardian/obj/local/armeabi/libdemo.so] Error 1

经过一些研究,出现此问题是因为库未按正确顺序链接。我试图改变这个顺序,但没有任何改变。

有人可以帮我解决最后一步,让 ffmpeg 在 android 上工作吗?谢谢 !

4

0 回答 0