【问题标题】:Android ndk ffmpeg : Unknown mnemonic errorAndroid ndk ffmpeg:未知的助记符错误
【发布时间】:2016-09-27 07:01:15
【问题描述】:

我正在构建一个简单的视频应用,并希望在录制的视频上嵌入水印。我在这个过程中使用 ffmpeg 并成功编译了它。问题是当我尝试使用 ndk-build.cmd 命令将它与我在 Android Studio 中的项目链接时,它给了我以下错误:

C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s: Assembler messages:
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s:8547: Error: unknown mnemonic `itt' -- `itt gt'
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s:8548: Error: unknown mnemonic `movgt' -- `movgt x25,x0'
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s:8549: Error: unknown mnemonic `movgt' -- `movgt x0,x1'
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s:8551: Error: unknown mnemonic `it' -- `it le'
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s:8552: Error: unknown mnemonic `movle' -- `movle x0,x2'
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s:8554: Error: unknown mnemonic `it' -- `it gt'
C:\Users\MyPC\AppData\Local\Temp\ccIRLDZn.s:8555: Error: unknown mnemonic `movgt' -- `movgt x25,x0'
make: *** [obj/local/arm64-v8a/objs/myProject_Videokit/ffmpeg.o] Error 1

我的开发环境是

  • 操作系统:Windows10 x86_64
  • 命令行:Cygwin 64bit
  • Android NDK 版本:android-ndk-r11c
  • ffmpeg 版本:ffmpeg-3.0.2
  • Android Studio : 2.1.1

首先,我安装了 Cygwin64bit 并添加了 'make'、'dos2unix'、'c++ gcc' 包。我解压了 C:/android-ndk-r11c/sources 中的 ffmpeg 文件夹。这是我使用的构建脚本。

config.sh

#!/bin/bash
NDK=C:/android-ndk-r11c
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64

#I used cygpath to avoid path errors in Cygwin. 

CUR="$(cygpath -m "$(pwd)")" 
TEMPDIR="$(cygpath -m "/tmp")"
TMP="$(cygpath -m "/tmp")"
TMPDIR="$(cygpath -m "/tmp")"
CPU=arm
PREFIX=$CUR/android/$CPU 
ADDI_CFLAGS="-marm"

./configure 
    --prefix=$PREFIX 
    --enable-shared 
    --disable-static 
    --disable-doc 
    --disable-ffmpeg 
    --disable-ffplay 
    --disable-ffprobe 
    --disable-ffserver 
    --disable-doc 
    --disable-symver 
    --enable-protocol=concat
    --enable-protocol=file
    --enable-muxer=mp4
    --enable-demuxer=mpegts
    --enable-memalign-hack
    --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

我在 Cygwin(以管理员身份)中运行了这个 .sh,但它不起作用。所以我在 Cygwin 上输入了每一行,它编译成功。我尝试了--target-os=android--target-os=linux,但都没有解决上面的问题。

然后我按照本教程进行操作(enoent.fr/blog/2014/06/20/compile-ffmpeg-for-android/)。基于此,我在我的项目中创建了一个本地方法,并构建了头文件和 c 文件。(为此,我关注了这个视频。youtube.com/watch?v=kFtxo7rr2HQ)

之后,我克隆了这个 repo(github.com/HikoQiu/JNI_INVOKE_FFMPEG) 并将 jni 文件夹复制并粘贴到我的项目中。在制作了 Android.mk 和 Application.mk 之后,我在 Android Studio 终端中运行了 C:/android-ndk-r11c/ndk-build.cmd,它给了我上面的错误。

这些是我使用的 Makefile。

myProject/app/src/main/jni/Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := com_example_project_Videokit
LOCAL_LDLIBS := -llog -ljnigraphics -lz
LOCAL_CFLAGS := -Wdeprecated-declarations
ANDROID_LIB := -landroid
LOCAL_C_INCLUDES := C:\android-ndk-r11c\sources\ffmpeg-3.0.2
LOCAL_SRC_FILES := com_example_project_Videokit.c ffmpeg.c ffmpeg_filter.c ffmpeg_opt.c cmdutils.c
LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil
include $(BUILD_SHARED_LIBRARY)
$(call import-module,ffmpeg-3.0.2/android/arm)

myProject/app/src/main/jni/Application.mk

APP_ABI := all

C:/android-ndk-r11c/sources/ffmpeg-3.0.2/android/arm/Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec-57.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat-57.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale-4.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil-55.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter-6.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:= libwsresample
LOCAL_SRC_FILES:= lib/libswresample-2.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

这是我目前的项目结构。 com_example_myProjct.c 是我在 build.gradle 文件中用作 moduleName 并在 Android.mk 中用作 LOCAL_MODULE 的文件。

app
 - build
 - libs
 - src
   - androidTest
   - main
     - java
        -com.example.myProject
          -MainActivity
          -Videokit   //this is the class where I called the native method.
     - jni
        -Android.mk
        -Application.mk
        -cmdutils.c
        -cmdutils.h
        -com_example_myProject.c
        -com_example_myProject.h
        -ffmpeg.c
        -ffmpeg.h
        -ffmpeg_filter.c
        -ffmpeg_opt.c
        -ffmpeg_opt.h
        -logjam.h
   - obj
   - res
   AndroidManifest.xml
 - test 

app/gradle.build

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.example.myProjct"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0.0"

        ndk {
            moduleName "com_example_myProjet_Videokit"
        }
        sourceSets.main {
            jni.srcDirs = []
            jniLibs.srcDir 'src/main/libs'
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-rules.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
}

有什么想法吗?

【问题讨论】:

    标签: android ffmpeg android-ndk


    【解决方案1】:

    正如编译错误报告的最后一行所说:

    make: *** [obj/local/arm64-v8a/objs/myProject_Videokit/ffmpeg.o] Error 1
    

    这是关键。您正在尝试为所有可用的 ABI 构建您的应用程序。我可以看到您的build.gradle 文件,没有abiFilter。我会用下一种方式来做(我不确定语法,但是):

    android {
    ...
        ndk {
            moduleName "com_example_myProjet_Videokit"
            abiFilters = "x86", "armeabi"
        }
    ...
    }
    

    如果我是你,我会使用 gradle-experimental plugin,为所有需要的 ABI 预构建 ffmpeg 库,然后使用 this 方法加载库。

    所以主要问题 - 你有一个所有 ABI 的库。这是不正确的。

    【讨论】:

    • 嘿,你能介绍一下其他方法吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 2011-12-08
    • 2018-05-05
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多