Подтвердить что ты не робот

Хотите скомпилировать собственный Android-бинар, который я могу запустить в терминале по телефону

Я пытаюсь на пару дней скомпилировать собственный двоичный файл ARM Android, который будет выполняться на моем телефоне с помощью терминала. Я хочу создать двоичный код того же типа, что и стандартные двоичные файлы Posix, установленные на телефоне, такие как ls, mkdir и т.д. Я загрузил Android NDK под Mac OS X и смог скомпилировать простые файлы ELF без ошибок. Однако, когда я переношу их на телефон, они всегда срываются. То есть они segfault при компиляции с -статическим в GCC. Если я не использую -статический, они жалуются на то, что не связаны, и т.д. Просто, они не работают.

Моя гипотеза заключается в том, что они не связаны с стандартной библиотекой C Android. Несмотря на то, что я связываю свои двоичные файлы с libc, предоставленные NDK, они все равно не работают. Я читал, что Android использует библиотеку Bionic C и пытается загрузить исходный код, но я не уверен, как построить из него библиотеку (кажется, это сборка ARM).

Правда ли, что библиотека Android C на телефоне отличается от библиотеки Android NDK? Будет ли тот, который включен в NDK, не позволяет мне скомпилировать собственные двоичные файлы, которые я могу выполнить через терминал? Любое руководство здесь очень ценится!

Update:

Я, наконец, получил это, чтобы работать с GCC 4.7.0 в Mac OS X. Я загрузил заголовки Bionic, а затем скомпилировал динамически связанный бинарный файл, используя библиотеку C, которая поставляется с Android NDK. Я смог получить тестовое приложение для работы по телефону с помощью телефона C lib (двоичный файл был 33K). Я также попытался статически связать с библиотекой NDK C, и это также сработало.

Чтобы получить все это, мне пришлось передать -nostdlib в GCC, а затем вручную добавить crtbegin_dynamic.o и crtend_android.o в командную строку GCC. Он работает примерно так:

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

Для статических двоичных файлов используйте "crtbegin_static.o". Это объясняется в источнике crtbegin_dynamic.S/crtbegin_static.S.

В этом эксперименте я использовал только простые 'ol GCC 4.7.0 и Binutils 2.22. Я также скомпилировал GCC с newlib, но я вообще не связываю свои ARM файлы с newlib. Я заставляю GCC/ld напрямую ссылаться на libc, поставляемый с Android NDK, или в случае динамических двоичных файлов, на libc на телефоне.

4b9b3361

Ответ 1

Просто используйте android-ndk. И создайте Android.mk так. include $(BUILD_EXECUTABLE) - это то, что говорит, что он создает исполняемый файл вместо 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

Ответ 2

Сначала убедитесь, что у вас есть NDK:

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

Вот самый простой способ скомпилировать бинарный файл C для вашего телефона:

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

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

Обычно $NDK (может быть разным) =

Linux:

/главная/<user>/андроид-NDK

Mac OS X:

/Users/<user>/андроид-NDK

В терминале:

# 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

Ответ 3

Использование CMake с Android NDK - отличный способ скомпилировать приложения для Android.

Загрузите CMake и android-cmake ( настройте как это). Если ваша программа называется main.c, тогда напишите следующее в файле CMakeLists.txt:

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

и запустите cmake -DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN .

После этого у вас будет Makefile для вашей программы, вы можете запустить make, чтобы иметь исполняемый файл test.

Ответ 4

Попробуйте, если agcc wrapper может помочь вам, как указано в Android-tricks. Согласно сообщению в блоге, вы хотите использовать бионическую библиотеку, но тот, который уже установлен на телефоне, а не какая-то отдельно скомпилированная версия.