2017-03-16 59 views
0

新的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 
+0

你不應該從Ubuntu複製標題。嘗試在googlesource.com上的Android repo中找到相應的標頭。無論如何,你的失敗是針對MIPS架構的。你確定你會永遠在這樣的設備上運行你的圖書館嗎?我建議從命令行開始運行'ndk-build V = 1'並分析日誌。 –

+0

你說得對,我不能從Ubuntu的x86版本複製頭文件。作爲這裏的新手,我沒有意識到頭文件是特定於體系結構的。顯然他們是。而且,是的,我不需要MIPS,所以我在我的build.gradle中添加了'abiFilters「armeabi-v7a」'。但現在我需要該架構的標題。 Android NDK包含一些頭文件,但它不包含所需的Linux內核頭文件,如'linux/net_tstamp.h',所以我必須從某處獲得這些頭文件。 – davidgyoung

+0

FWIW,'linux/net_tstamp.h'可以在NDK中找到(對於平臺21和更高版本)。但是你總是可以從https://android.googlesource.com/platform/external/kernel-headers獲取內核頭文件 –

回答

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構建更容易。但是這個功能還沒有經過足夠的測試。

+1

謝謝@ @ alex-cohn。超級有用! – davidgyoung