私は、ターミナルアプリケーションを使用して携帯電話で実行されるネイティブの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に。
Android-ndkを使用するだけです。そして、Android.mkを次のようにビルドします。 include $(BUILD_EXECUTABLE)
は、JNI .libの代わりに実行可能ファイルをビルドすることを指示するものです
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
まず、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
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
実行可能ファイルを作成できます。
agcc wrapper が Android-tricks ブログで参照されているように役立つ場合は試してください。ブログ投稿によると、バイオニックライブラリを使用したいが、電話に既にインストールされているであり、個別にコンパイルされたバージョンではありません。