Вопрос по android, gcc, c, arm – Хотите скомпилировать родной бинарный файл Android, я могу запустить в терминале на телефоне

31

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

Моя гипотеза заключается в том, что они неправильно связываются со стандартной библиотекой 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 телефона (двоичный файл был 33 КБ). Я также пытался статически связываться с библиотекой C NDK, и это также работало.

Чтобы все это заработало, мне пришлось передать -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

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

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

К вашему сведению, если вы настроите сборку так, как если бы вы создавали библиотеку jni (см. Примеры в дистрибутиве NDK) и изменили BUILD_SHARED_LIBRARY в Android.mk на BUILD_EXECUTABLE, вы получите исполняемый файл, хотя это неофициальный вариант (может исчезнуть) и т. д.) особенность системы сборки ndk. Chris Stratton
Возможный дубликатHow can i run C binary (executable file) in Android from Android Shell Ciro Santilli 新疆改造中心 六四事件 法轮功

Ваш Ответ

3   ответа
3

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

СкачатьCMakeError: User Rate Limit ExceededError: User Rate Limit Exceeded (установите этоError: User Rate Limit Exceeded). Если ваша программа называется main.c, то напишите следующее в файлCMakeLists.txt:

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

Error: User Rate Limit Exceededcmake -DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN .

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

16

Во-первых, убедитесь, что у вас есть 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

Error: User Rate Limit Exceeded

Linux:

/Главная/<user>/ Android-НДК

Mac OS X:

/ Пользователи /<user>/ Android-НДК

В терминале:

# 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
Error: User Rate Limit Exceededobject fileError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded-cError: User Rate Limit Exceeded
20

Error: User Rate Limit Exceededinclude $(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
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededendif

Похожие вопросы