35

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

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

携帯電話の 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 のみを使用しました。GCC も newlib でコンパイルしましたが、実際には ARM バイナリを newlib とまったくリンクしていません。Android NDK で提供される libc に直接リンクするように GCC/ld を強制しています。動的バイナリの場合は、電話の libc にリンクします。

4

4 に答える 4

20

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
于 2012-06-09T23:16:11.673 に答える
3

Android NDK で CMake を使用することは、Android コンソール アプリケーションをコンパイルするための優れた方法です。

CMakeandroid-cmakeをダウンロードします (このように設定します)。プログラムの名前が main.c の場合、 file に次のように記述しますCMakeLists.txt

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

そして走るcmake -DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN .

その後、プログラムの Makefile が作成され、実行可能ファイルを作成するmakeためにtest実行できます。

于 2012-05-30T13:26:25.543 に答える
0

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

于 2012-05-29T12:07:18.113 に答える