新的Android NDK開發中,我試圖獲得一個Android應用程序,該應用程序設計爲使用ndkBuild在Mac上的Android Studio下構建的Eclipse for Linux下。在Mac上使用Studio的Android NDK:無法識別的操作碼
它與「無法識別的操作碼」組裝失敗。我認爲這是針對目標處理器的某種交叉編譯問題,但我不知道如何使用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 repo中找到相應的標頭。無論如何,你的失敗是針對MIPS架構的。你確定你會永遠在這樣的設備上運行你的圖書館嗎?我建議從命令行開始運行'ndk-build V = 1'並分析日誌。 –
你說得對,我不能從Ubuntu的x86版本複製頭文件。作爲這裏的新手,我沒有意識到頭文件是特定於體系結構的。顯然他們是。而且,是的,我不需要MIPS,所以我在我的build.gradle中添加了'abiFilters「armeabi-v7a」'。但現在我需要該架構的標題。 Android NDK包含一些頭文件,但它不包含所需的Linux內核頭文件,如'linux/net_tstamp.h',所以我必須從某處獲得這些頭文件。 – davidgyoung
FWIW,'linux/net_tstamp.h'可以在NDK中找到(對於平臺21和更高版本)。但是你總是可以從https://android.googlesource.com/platform/external/kernel-headers獲取內核頭文件 –