web-dev-qa-db-ja.com

ネイティブAndroid携帯電話の端末で実行できるバイナリをコンパイルしたい

私は、ターミナルアプリケーションを使用して携帯電話で実行されるネイティブのARM Androidバイナリをコンパイルするために、数日間試してきました。携帯電話にインストールされているls、mkdirなどの標準Posixバイナリと同じタイプのバイナリ。MacOS XでAndroid NDKをダウンロードし、エラーなしで簡単なELFバイナリをコンパイルできました。ただし、それらを電話に転送すると、常にセグメンテーション違反になります。つまり、GCCで-staticを指定してコンパイルすると、セグメンテーション違反が発生します。-staticを使用しないと、リンクされないなどの不満を言います。動作しません。

私の仮説は、それらがAndroid標準Cライブラリに適切にリンクしていないということです。NDKが提供するlibcにバイナリをリンクしているにもかかわらず、まだ動作しません。 Android Bionic Cライブラリを使用し、そのソースをダウンロードしようとしましたが、そこからライブラリをビルドする方法がわかりません(すべてARM Assembly 、 そうみたいです)。

電話機のAndroid Cライブラリは、Android NDKで提供されているものとは異なりますか?NDKに含まれているものは許可されませんか?ターミナルから実行できるネイティブバイナリをコンパイルするには?ここでのガイダンスは大歓迎です!

更新:

Mac OS XでGCC 4.7.0を使用してようやくこれが機能するようになりました。Bionicヘッダーをダウンロードし、Android NDKに付属するCライブラリを使用して動的にリンクされたバイナリをコンパイルしました。携帯電話のCライブラリ(バイナリは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のみを使用しました。また、newlibでGCCをコンパイルしましたが、実際にはARMバイナリをnewlibにリンクしていません。GCC/ ldにAndroid NDK、または動的バイナリの場合は、電話のlibcに。

32
Synthetix

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
20
SonicBison

まず、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:

/ home/<user>/Android-ndk

Mac OS X:

/ Users/<user>/Android-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
17
Jared Burrows

Android NDKでCMakeを使用すると、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実行可能ファイルを作成できます。

3
gfour

agcc wrapperAndroid-tricks ブログで参照されているように役立つ場合は試してください。ブログ投稿によると、バイオニックライブラリを使用したいが、電話に既にインストールされているであり、個別にコンパイルされたバージョンではありません。

0
Prof. Falken