我试图让FFmpeg在Android上运行,并在 Ubuntu 64bit 上成功编译后,在source / ffmpeg-3.4.2 / android / arm下创建了Android.mk文件夹以及我自己的Android项目中的Android.mk !我无法编译一个简单的程序并创建.so文件! 顺便说一句,我已经在网上和Stackoverflow中搜索了2天,但没有运气! 这是代码 Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := MyLibrary
LOCAL_SRC_FILES := MyNativeFunctions.c
LOCAL_LDLIBS := -lz -llog
LOCAL_STATIC_LIBRARIES := libavformat_static libavcodec_static libavutil_static
include $(BUILD_SHARED_LIBRARY)
$(call import-module,ffmpeg-3.2.4/android/arm)
原生函数
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/avutil.h>
#include <android/log.h>
#define LOG_TAG "mylib"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
jint Java_com_example_home_hellondk_MyNativeFunctions_TestNdk(JNIEnv * env, jobject this, jstring filename)
{
av_register_all();
return 0;
}
当我在这里使用NDK-BUILD时,我得到了错误:
/home/home/Android/Sdk/ndk-bundle/sources/ffmpeg-3.2.4/android/arm/lib/libavformat.a: error adding symbols: File in wrong format
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [obj/local/arm64-v8a/libMyLibrary.so] Error 1
[编辑] 的 Build_android.sh
#!/bin/bash
NDK=/home/home/Android/Sdk/ndk-bundle
SYSROOT=$NDK/platforms/android-24/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--disable-shared \
--enable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
[编辑] 通过添加缺少的库来解决问题 LOCAL_STATIC_LIBRARIES:= libavformat_static libavcodec_static libswscale_static libavutil_static libswresample_static 对于Android Studio的所有用户,请不要忘记将此行添加到您的gradle中,否则它将无法正常工作。
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir 'src/main/libs'
}
致以诚挚的问候
答案 0 :(得分:1)
您只需为arm32构建ffmpeg,但您正在为所有ABI构建应用。
在您的ffmpeg构建脚本中,您专门针对arm进行了定位:
SYSROOT=$NDK/platforms/android-24/arch-arm/
从错误输出中你可以看到它正在构建arm64:
make: *** [obj/local/arm64-v8a/libMyLibrary.so] Error 1
将ndk-build限制为仅构建arm32(APP_ABI := armeabi-v7a
中的Application.mk
)或者为其他体系结构构建ffmpeg。
顺便说一句,如果您使用https://developer.android.com/ndk/guides/standalone_toolchain.html
,您可以更轻松地使用NDK构建autoconf项目