usar lista comandos code android c gcc android-ndk arm

lista - Quiero compilar un binario nativo de Android que puedo ejecutar en la terminal del teléfono



terminal android comandos wifi (4)

Intente si el envoltorio de agcc puede ayudarlo como se menciona en el blog Android-tricks . De acuerdo con la publicación del blog, usted quiere usar la biblioteca biónica, pero la que ya está instalada en el teléfono , no una versión compilada por separado.

He intentado durante un par de días para compilar un ARM nativo de Android ARM que se ejecutará en mi teléfono con una aplicación de terminal. Quiero generar el mismo tipo de binario que los binarios estándar de Posix instalados en el teléfono como ls, mkdir, etc. He descargado el NDK de Android bajo Mac OS X y he podido compilar binarios ELF simples sin errores. Sin embargo, cuando los transfiero al teléfono, siempre segfault. Es decir, segfault cuando se compila con -static en GCC. Si no uso -estático, se quejan de que no están vinculados, etc. En pocas palabras, no funcionan.

Mi hipótesis es que no están enlazando correctamente a la biblioteca estándar C de Android. Aunque estoy vinculando mis binarios con la libc proporcionada por el NDK, todavía no funcionan. Leí que Android usa la biblioteca Bionic C, y traté de descargar la fuente para ello, pero no estoy seguro de cómo crear una biblioteca a partir de ella (parece que todo es ensamblado ARM).

¿Es cierto que la biblioteca de Android C en el teléfono es diferente de la proporcionada con Android NDK? ¿El que se incluye con el NDK no me permite compilar los binarios nativos que puedo ejecutar a través de un terminal? Cualquier orientación aquí es muy apreciada!

Actualizar:

Finalmente conseguí que esto funcionara usando GCC 4.7.0 en Mac OS X. Descargué los encabezados Bionic y luego compilé un binario enlazado dinámicamente usando la biblioteca C que viene con el NDK de Android. Pude obtener una aplicación de prueba para que funcionara en el teléfono usando la biblioteca C del teléfono (el binario era de 33K). También traté de vincular estáticamente contra la biblioteca C de NDK, y eso también funcionó.

Para que todo esto funcione, tuve que pasar -nostdlib a GCC y luego agregar manualmente crtbegin_dynamic.o y crtend_android.o a la línea de comando de GCC. Funciona de la siguiente manera:

$CC / $NDK_PATH/usr/lib/crtbegin_dynamic.o / hello.c -o hello / $CFLAGS / $NDK_PATH/usr/lib/crtend_android.o

Para binarios estáticos, use "crtbegin_static.o". Esto se explica en la fuente crtbegin_dynamic.S / crtbegin_static.S.

Para este experimento, solo utilicé ''ol GCC 4.7.0 y Binutils 2.22. También compilé GCC con newlib, pero en realidad no estoy vinculando mis binarios ARM con newlib. Estoy forzando a GCC / ld a vincular directamente a la libc proporcionada con Android NDK, o en el caso de los binarios dinámicos, a la libc en el teléfono.


Primero, asegúrate de tener el NDK:

http://developer.android.com/tools/sdk/ndk/index.html

Esta es la forma más fácil de compilar un binario C para su teléfono:

http://developer.android.com/tools/sdk/ndk/index.html

http://www.kandroid.org/ndk/docs/STANDALONE-TOOLCHAIN.html

Usualmente $ NDK (puede ser diferente) =

Linux:

/ inicio / <user> / android-ndk

Mac OS X:

/ Users / <user> / android-ndk

En la Terminal:

# create tool-chain - one line # New method in ndk 12. $NDK/build/tools/make_standalone_toolchain.py --arch arm --install-dir=/tmp/my-android-toolchain # Old method. #$NDK/build/tools/make-standalone-toolchain.sh --platform=android-3 --install-dir=/tmp/my-android-toolchain # add to terminal PATH variable export PATH=/tmp/my-android-toolchain/bin:$PATH # make alias CC be the new gcc binary export CC=arm-linux-androideabi-gcc # compile your C code(I tried hello world) $CC -o foo.o -c foo.c # push binary to phone adb push foo.o /data/local/tmp # execute binary adb /data/local/tmp/foo.o


Solo usa el android-ndk. Y crea un Android.mk como tal. include $(BUILD_EXECUTABLE) es lo que le dice que include $(BUILD_EXECUTABLE) un ejecutable en lugar de un JNI .lib

Android.mk

ifneq ($(TARGET_SIMULATOR),true) LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_CFLAGS += -Wall LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -llog -g LOCAL_C_INCLUDES := bionic LOCAL_C_INCLUDES += $(LOCAL_PATH)/include LOCAL_SRC_FILES:= main.cpp LOCAL_MODULE := mycmd include $(BUILD_EXECUTABLE) endif # TARGET_SIMULATOR != true


Usar CMake con Android NDK es una buena manera de compilar aplicaciones de consola de Android.

Descargue CMake y android-cmake ( android-cmake así ). Si su programa se llama main.c, escriba lo siguiente en el archivo CMakeLists.txt :

project(test) cmake_minimum_required(VERSION 2.8) add_executable(test ./main.c)

y ejecute cmake -DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN .

Luego tendrá un Makefile para su programa, puede ejecutar make para que su test ejecutable.