【发布时间】: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