私がインストールしたデバイスがあります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
を使用していますこのようなディレクトリ構造はありません
まず、私の答えは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)以降。
$NDK_ROOT
_(解凍した場合のNDK Zipの最上位フォルダー)に移動します。$NDK_ROOT/samples/hello-jni
_ディレクトリを_$NDK_ROOT/sources/hello-world
_としてコピーします。$NDK_ROOT/sources/hello-world
_に移動します。AndroidManifest.xml
_を編集して、アプリケーションに適切な名前を付けます(これはオプションです)。$NDK_ROOT/sources/hello-world/jni
_に移動します。ここにソースコードがあります。hello-jni.c
_を編集し、すべてのコードを削除して、_hello world
_コードを挿入します。私は:#include int main(int argc、char * argv []) { printf( "Hello、World!"); return 0; }
Android.mk
_を編集し、include $(BUILD_SHARED_LIBRARY)
行をinclude $(BUILD_EXECUTABLE)
に変更します。 _LOCAL_MODULE
_行を実行可能ファイルの名前に変更することもできます(デフォルトは_hello-jni
_です)$NDK_ROOT/sources/hello-world
_に戻る../../ndk-build
_を実行して、実行可能ファイルを作成します。$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
を介して行われます)/data/local/tmp/hello-jni
_のようなフルパスでバイナリを実行するか、名前を付けてください。これで完了です(そして、$ NDK_ROOT/docsのドキュメントから自由に始めて、何をすべきかをよりよく理解できます)。
実行可能ファイルを配置するのに最適な場所は、/ 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
を試してください
最近、新しいnexus-5でも同じ問題が発生しました。/data/localがユーザーによって書き込み可能ではないことを追加したいと思います(「Shell」、uid 2000)adb Shellで取得しました。しかし、サブディレクトリ/ data/local/tmp /に実行可能ファイルを置くことはうまくいきました。
「/ sdcard」の場所は実行可能ではありません。つまり、そこにあるファイルはすべて実行可能ではありません。
「adb Push」実行可能ファイルへの唯一の方法は、それらを「/ data/local」に置くことです。
一言で言えば、
まず、ホストマシンから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
から実行します。