2015-10-23 22 views
10

Tôi đang cố gắng xây dựng một ứng dụng HelloWorld đơn giản và chạy nó trên Genymotion. Hệ thống xây dựng của tôi là Ubuntu 14.04 64bit. Tôi đã cài đặt Android SDK (r22.6.2) và NDK (r9d).Cách biên dịch chương trình C cho Genymotion (Android x86)

nỗ lực đầu tiên: Xây dựng bằng cách sử dụng được xây dựng sẵn NDK ARM toolchain

TOOLCHAIN = $NDK/toolchains/arm-linux-androideabi-4.8 
$TOOLCHAIN/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=$PLATFORM hello.c -o hello 
adb push hello /sdcard/ 
./hello 

tôi nhận được một lỗi

/system/bin/sh: ./Hello: not executable: magic 7F45 

Sau khi thực hiện một số nghiên cứu, tôi nhanh chóng nhận ra Genymotion có x86 vòm thay vì ARM

Lần thử thứ hai: Tạo bằng công cụ độc lập x86 Chuỗi

  1. Make x86 standlone toolchain đầu tiên

    cd $NDK/build/tools 
    ./make-standalone-toolchain.sh --arch=x86 --platform=android-19 --install-dir=/tmp/android-toolchain --ndk-dir=../../. --system=linux-x86_64 
    
  2. Build Xin chào sử dụng toolchain

    cd tmp/android-toolchain/bin 
    ./i686-linux-android-gcc -o Hello -c hello.c 
    
  3. Run Xin chào trên Genymotion

    adb push hello /data/local/tmp 
    adb shell 
    cd /data/local/tmp 
    ./hello 
    /system/bin/sh: ./Hello: not executable: magic 7F45 
    

Ran uname -a trên máy genymotion. Android System Name Ran file Hello trên thực thi Hello File info

Vì vậy, nó phải là một trận đấu.

Vẫn gặp lỗi tương tự. Sẽ thực sự đánh giá cao nếu ai đó có thể làm sáng tỏ.

Chỉnh sửa 1: Đã cố gắng chạy tệp thực thi trong/data/local/tmp thay vì/sdcard /. Vẫn cho cùng một lỗi.

Chỉnh sửa 2: Ran uname trên hệ thống genymotion và file trên thực thi để xem chúng có khớp không.

+0

Tôi tin rằng có sự nhầm lẫn: bạn đẩy 'hello' vào'/sdcard', nhưng chạy 'Hello' từ'/'(thư mục gốc). Ở bất kỳ mức nào, Android gắn thẻ/sdcard và bộ nhớ ngoài khác là không thể thực thi, vì lý do bảo mật. Do đó, nếu bạn muốn đẩy và chạy tệp thực thi của mình, hãy sử dụng một số thư mục khác. '/ data/local/tmp' thường là một lựa chọn tốt. –

+0

Tôi vừa thử chạy tệp thực thi trong/data/local/tmp. Vẫn cho tôi lỗi tương tự – HBZ

+0

Bạn có chạy 'chmod 700/data/local/tmp/hello' không? –

Trả lời

1

Nếu đồng bằng GCC không hoàn thành công việc của bạn, bạn sẽ phải đi theo con đường khó khăn hơn.

Bạn cần có chuỗi công cụ chéo; Tôi đề nghị tạo ra một toolchain chéo Canada sử dụng Crosstool ~ ng; bạn có thể sử dụng chuỗi công cụ độc lập của NDK làm điểm bắt đầu.

Các vấn đề liên quan