Android NDK开发新手,我正在尝试使用ndkBuild在Mac下的Android Studio下构建一个Android应用程序,该应用程序旨在使用Eclipse for Linux进行构建。
使用“无法识别的操作码”进行组装失败。我认为这是目标处理器的某种交叉编译问题,但我不知道如何使用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
答案 0 :(得分:1)
对于Android版本,请使用Android头文件。如果某些标头在NDK中不可用,您可以使用android.googlesource.com/platform/external/kernel-headers。
请注意,这些标头取决于ABI和API level。如果某些头文件在NDK for android-14中丢失或不完整但可以在android-21中找到它并不一定意味着所需的内核函数不可用,但你应该格外小心。
最新的NDK r14提出了一种使用Android头文件的新方法,他们称之为Unified headers。此开关应该减少麻烦并使Android构建更容易。但是这个功能尚未经过足够的测试。