【问题标题】:Android NDK with Studio on Mac: Unrecognized opcodeMac 上带有 Studio 的 Android NDK:无法识别的操作码
【发布时间】:2017-03-16 13:03:59
【问题描述】:

Android NDK 开发新手,我正在尝试使用 ndkBuild 在 Mac 上的 Android Studio 下构建一个旨在在 Eclipse for Linux 下构建的 Android 应用程序。

使用“无法识别的操作码”组装失败。我认为这是目标处理器的某种交叉编译问题,但我不知道如何使用 ndkBuild 进行配置。执行此编译所需的 Linux 头文件是从同一 Mac 上的 Ubuntu VM 复制的。

知道如何解决这个装配错误吗?

这是我的 build.gradle:

defaultConfig {
    applicationId "net.kismetwireless.android.pcapcapture"
    minSdkVersion 13
    targetSdkVersion 15

    ndk {
        moduleName "libpcap"
    }
    externalNativeBuild {
        ndkBuild {
            cFlags "-Wno-return-type"
        }
    }

}

externalNativeBuild {
    ndkBuild {
        path "src/main/jni/Android.mk"
    }
}

我的 Android.mk 看起来像这样:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= libpcap
LOCAL_SRC_FILES:= \
    libpcap-1.3.0/pcap-linux.c \
    libpcap-1.3.0/fad-null.c \
    libpcap-1.3.0/pcap.c \
    libpcap-1.3.0/inet.c \
    libpcap-1.3.0/gencode.c \
    libpcap-1.3.0/optimize.c \
    libpcap-1.3.0/nametoaddr.c \
    libpcap-1.3.0/etherent.c \
    libpcap-1.3.0/savefile.c \
    libpcap-1.3.0/sf-pcap.c \
    libpcap-1.3.0/sf-pcap-ng.c \
    libpcap-1.3.0/pcap-common.c \
    libpcap-1.3.0/bpf_image.c \
    libpcap-1.3.0/bpf_dump.c \
    libpcap-1.3.0/scanner.c \
    libpcap-1.3.0/grammar.c \
    libpcap-1.3.0/bpf_filter.c \
    libpcap-1.3.0/version.c \
    pcap_jni.c
#include $(BUILD_EXECUTABLE)
LOCAL_CFLAGS    := -DSYS_ANDROID=1 -Dyylval=pcap_lval -DHAVE_CONFIG_H  -D_U_="__attribute__((unused))" -I$(LOCAL_PATH)/libpcap-1.3.0
LOCAL_LDLIBS    := -llog
include $(BUILD_SHARED_LIBRARY)

运行./gradlew build时我的错误输出如下所示:

  /var/folders/k6/80v30vf13kdc8qd2rjtq35640000gn/T/pcap-linux-60f203.s: Assembler messages:
  /var/folders/k6/80v30vf13kdc8qd2rjtq35640000gn/T/pcap-linux-60f203.s:357: Error: unrecognized opcode `rorw $8,$23'
...
  /var/folders/k6/80v30vf13kdc8qd2rjtq35640000gn/T/pcap-linux-60f203.s:8369: Error: unrecognized opcode `rorw $8,$2'
  clang: error: assembler command failed with exit code 1 (use -v to see invocation)
  make: *** [/Users/dyoung/workspace/wireless-r/android-pcap-studio/app/build/intermediates/ndkBuild/debug/obj/local/mips64/objs/pcap/libpcap-1.3.0/pcap-linux.o] Error 1

【问题讨论】:

  • 您不应该从 Ubuntu 复制标头。尝试在 googlesource.com 上的 Android 存储库中找到相应的标头。无论如何,您的失败是针对 MIPS 架构的。你确定你会在这样的设备上运行你的图书馆吗?我建议先从命令行运行ndk-build V=1,然后分析日志。
  • 你说得对,我无法从 Ubuntu for x86 复制标头。作为这里的新手,我没有意识到标题是特定于架构的。显然他们是。而且,是的,我不需要 MIPS,所以我在 build.gradle 中添加了 abiFilters "armeabi-v7a"。但现在我需要该架构的标题。 Android NDK 包含一些头文件,但它不包含所需的 Linux 内核头文件,如 linux/net_tstamp.h,所以我必须从某个地方获取这些头文件。
  • FWIW, linux/net_tstamp.h 可以在 NDK 中找到(适用于 21 及更高平台)。但是你总是可以从android.googlesource.com/platform/external/kernel-headers 获取内核头文件
  • 该死,你是对的,它就在那里!出于某种原因,我的构建没有自动拾取包含文件夹,所以我错误地认为它不存在......但这是一个不同的问题!谢谢,@亚历克斯科恩。您应该将其格式化为答案,以便我接受。我从你那里学到的解决我的问题的关键是(1)我不应该从另一个安装中复制标头,因为它们是特定于体系结构的,以及(2)我可以从 $ANDRIOD- 中的 NDK 安装中为 ARM 获取它们SDK-HOME/ndk-bundle/platforms/android-21/arch-arm/usr/include

标签: android-ndk android-gradle-plugin


【解决方案1】:

对于 Android 构建,请使用 Android 头文件。如果某些标头在 NDK 中不可用,您可以使用android.googlesource.com/platform/external/kernel-headers

请注意,这些标头取决于 ABI 和 API level。如果 android-14 的 NDK 中某些标头丢失或不完整,但可以在 android-21 中找到,这并不一定意味着所需的内核函数不可用,但您应该格外小心。

最新的 NDK r14 提出了一种使用 Android 头文件的新方法,他们称之为Unified headers。这个开关应该会减少麻烦并使 Android 构建更容易。但是这个功能还没有经过足够的测试。

【讨论】:

  • 谢谢,@alex-cohn。超级有帮助!
猜你喜欢
  • 1970-01-01
  • 2015-01-13
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多