gpt4 book ai didi

Android ndk ffmpeg : Unknown mnemonic error

转载 作者:行者123 更新时间:2023-12-04 23:03:20 29 4
gpt4 key购买 nike

我正在构建一个简单的视频应用程序,并希望在录制的视频上嵌入水印。我在这个过程中使用 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
  • 安卓工作室:2.1.1

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

    配置文件
    #!/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

    应用程序/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'
    }

    有任何想法吗?

    最佳答案

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

    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 的库。这是不正确的。

    关于Android ndk ffmpeg : Unknown mnemonic error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37508876/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com