web-dev-qa-db-ja.com

Cを実行可能なバイナリファイルにコンパイルし、Android from Android Shell?

私がインストールしたデバイスがありますAndroid Gingerbread 2.3.4ここでAndroidデバイスでC実行可能ファイルを実行したい

私はデバイス上でAndroid NDKアプリケーションとその完全な実行を実行できますが、デバイス上で実行できるhello.c実行可能ファイルは1つだけです。

/* #includes #defines ... */

int main(){
    // Do something when this is executed
    return 0;
}

Android NDKツールチェーンを使用してこのファイルをコンパイルする方法はありますか。このファイルの実行可能ファイルを実行できます。

私は一つのことを見つけました ここ しかしこれは私のために働いていませんlinuxのAndroid NDK, Revision 7bを使用していますこのようなディレクトリ構造はありません

42
user1089679

まず、私の答えはLinuxでNDK r7b(r7cでも動作します)に依存していると言いましょう(他のシステムのパスを適切に変更します)。

編集:最後にテストされた_NDK r8e_ on Linuxおよび_Nexus 4_ with adb from _SDK Platform-Tools Rev 18_ on Windows 7(2013-07-25現在)ルートアクセスなし

まだ別の編集:Androidで実行する必要のあるネイティブバイナリの指示を変更するには この質問 をお読みください5.0(Lollypop)以降。

  1. _$NDK_ROOT_(解凍した場合のNDK Zipの最上位フォルダー)に移動します。
  2. _$NDK_ROOT/samples/hello-jni_ディレクトリを_$NDK_ROOT/sources/hello-world_としてコピーします。
  3. _$NDK_ROOT/sources/hello-world_に移動します。
  4. _AndroidManifest.xml_を編集して、アプリケーションに適切な名前を付けます(これはオプションです)。
  5. _$NDK_ROOT/sources/hello-world/jni_に移動します。ここにソースコードがあります。
  6. _hello-jni.c_を編集し、すべてのコードを削除して、_hello world_コードを挿入します。私は:
    #include 
     int main(int argc、char * argv [])
     {
     printf( "Hello、World!"); 
     return 0; 
    }
  7. _Android.mk_を編集し、include $(BUILD_SHARED_LIBRARY)行をinclude $(BUILD_EXECUTABLE)に変更します。 _LOCAL_MODULE_行を実行可能ファイルの名前に変更することもできます(デフォルトは_hello-jni_です)
  8. _$NDK_ROOT/sources/hello-world_に戻る
  9. _../../ndk-build_を実行して、実行可能ファイルを作成します。
  10. Androidデバイスで_$NDK_ROOT/sources/hello-jni/libs/armeabi/hello-jni_から_/data/local/tmp_にコピーし、パーミッションを755(rwxr-xr-x)に変更します。_LOCAL_MODULE_を変更した場合_$NDK_ROOT/sources/hello-world/jni/Android.mk_の行、実行可能ファイル名は_LOCAL_MODULE_ではなく_hello-jni_の新しい値になります(これはすべて、Android SDKからadbを介して行われます)
  11. _/data/local/tmp/hello-jni_のようなフルパスでバイナリを実行するか、名前を付けてください。

これで完了です(そして、$ NDK_ROOT/docsのドキュメントから自由に始めて、何をすべきかをよりよく理解できます)。

39
Samveen

実行可能ファイルを配置するのに最適な場所は、/ data/localです。 chmod 実行可能ファイルとしてのバイナリも必要です。また、バイナリを/sdcard/から/data/localに取得するために、2つのステップでこれを行う必要がある場合がよくあります。

$ adb Push mybin /sdcard/
$ adb Shell
$ cp /sdcard/mybin /data/local/mybin
$ cd /data/local
$ chmod 751 mybin

警告

  • すべてのシステムにcpがあるわけではありません。この場合、 cat を使用できます。

    $ cat /sdcard/mybin > /data/local/mybin

  • 一部のシステムでは、「シェル」ユーザーの/data/localへの書き込みが許可されていません。 /data/local/tmpを試してください

24
NuSkooler

最近、新しいnexus-5でも同じ問題が発生しました。/data/localがユーザーによって書き込み可能ではないことを追加したいと思います(「Shell」、uid 2000)adb Shellで取得しました。しかし、サブディレクトリ/ data/local/tmp /に実行可能ファイルを置くことはうまくいきました。

12
Niels Möller

「/ sdcard」の場所は実行可能ではありません。つまり、そこにあるファイルはすべて実行可能ではありません。

「adb Push」実行可能ファイルへの唯一の方法は、それらを「/ data/local」に置くことです。

11
dvhh

一言で言えば、

まず、ホストマシンからCコードをクロスコンパイルするには、sysrootオプションと位置独立オプション-fPIE -pieを指定してNDKツールチェーンを使用します。

$NDKROOT/toolchains/aarch64-linux-Android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-Android-gcc \
--sysroot=$NDKROOT/platforms/Android-22/Arch-arm64 -fPIE -pie main.c -o main

アーカイブ部分arrch64またはArch-arm64ツールチェーンバージョン部分4.9プラットフォームバージョン部分Android-22、およびホストマシンdarwin-x86_64のバイナリ形式は、環境によって異なる場合があります。

次に、/data/local/tmpの下にバイナリをプッシュし、adb Shellから実行します。

4
9re