Quiero compilar el binario nativo de Android que puedo ejecutar en terminal en el teléfono


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

Mi hipótesis es que no están enlazando a la biblioteca estándar de Android C correctamente. A pesar de que estoy vinculando mis binarios con el libc proporcionado por el NDK, todavía no funcionan. He leído que Android utiliza la biblioteca de Bionic C, y trató de descargar el código fuente de la misma, pero no estoy seguro de cómo construir una biblioteca de ella (es todo el montaje del BRAZO, parece).

Es cierto que el Androide C biblioteca en el teléfono es diferente de la que se proporciona con el Android NDK? ¿El que se incluye con el NDK no me permitirá compilar binarios nativos que pueda ejecutar a través de una terminal? Cualquier orientación aquí es muy apreciada!

Actualización:

Finalmente conseguí que esto funcionara usando GCC 4.7.0 en Mac OS X. Descargué los encabezados Biónicos 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 trabajar el teléfono usando la C lib del teléfono (el binario era 33K). También traté de enlazar 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 comandos de GCC. Funciona algo como esto:

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

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

Para este experimento, yo sólo se utilizaron las versiones "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 en absoluto. Estoy forzando a GCC / ld a enlazar directamente al libc provisto con el NDK de Android, o en el caso de los binarios dinámicos, al libc en el teléfono.

Author: Synthetix, 2012-05-29

4 answers

Simplemente use el android-ndk. Y construir un Android.mk así. include $(BUILD_EXECUTABLE) es lo que le dice construir 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
 19
Author: SonicBison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-30 21:47:00

Primero, asegúrate de tener el NDK:

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

Aquí está 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

Normalmente ND NDK (puede ser diferente) =

Linux:

/inicio/<user>/android-ndk

Mac OS X:

/Usuarios/<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
 15
Author: Jared Burrows,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-23 18:45:07

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

Descargar CMake y android-cmake (configurarlo como este). Si su programa se llama main.c, luego escribe lo siguiente en file CMakeLists.txt:

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

Y corre cmake -DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN .

Entonces tendrá un Makefile para su programa, puede ejecutar make para tener su test ejecutable.

 3
Author: gfour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-30 13:26:25

Intente si si el agcc wrapperpuede ayudarlo como se hace referencia en el blog Android-tricks. De acuerdo con la entrada del blog que desea utilizar la biblioteca bionic, pero el ya instalado en el teléfono, no alguna versión compilada por separado.

 0
Author: Prof. Falken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-29 12:07:18