以前、C 言語プログラムをUbuntu システムで実行ファイルにコンパイルし、 Android 6.0.1 システムを搭載したimx6q 開発ボードで実行したいと考えていましたが、gcc コンパイラを使用してコンパイルすると、実行ファイルはエラーが発生し、最後のメソッドもボード上で実行できませんでしたが、考え方を変えたところ、NDK コンパイルによって実行ファイルが生成され、開発ボード上で正常に実行できることがわかりました。発生した問題と解決策は、以下に詳しく記録されています。
目次
gcc コンパイルの問題
1.ファイルが見つかりません
C プログラム ファイルを入手したら、まず gcc コンパイラで実行可能ファイルにコンパイルすることを考えますが、gcc コンパイラでコンパイルされた実行可能ファイルを開発ボードに配置して実行すると、次のプロンプトが表示されます。そのようなファイルやディレクトリはありません。また、ファイルが見つかりません
後で、Ubuntu システムで以前にダウンロードした gcc コンパイラーを使用していることがわかりましたが、このコンパイラーは、開発ボードで Android システムをコンパイルするために使用したコンパイラーではなかったため、開発ボードで実行してコンパイルすることができませんでした。 Android イメージ コンパイラは、開発ボードの製造元が提供するカーネル コンパイラです。
2. 実行可能な 64/32 ビット プログラムではない
開発ボードに付属のコンパイラ (以下を参照) を使用して C プログラムをコンパイルする場合
コンパイル後、ボード上で実行可能ファイルを実行しましたが、まだ問題があり、「実行可能ではありません: 64 ビット ELF ファイル」というメッセージが表示されました。
開発ボードは 32 ビットですが、このプログラムは 64 ビットなので、プログラムを 32 ビットにコンパイルし、リファレンスを使用して64 ビット Linux で 32 ビット プログラムをコンパイルしました。
コンパイルされたファイルを開発ボード上で実行すると、プログラムは 32 ビットになっていますが、まだ実行できないファイルであることがわかります。
問題を解決するための NDK コンパイル
次に、変換方法を決定します。gcc コンパイルに固執する必要はなくなりました。ndk コンパイルを使用すると、実行可能ファイルも生成され、開発ボードにコピーして実行することもできます。具体的な手順は次のとおりです。
まず、フォルダ内に c プログラムと Android.mk ファイルを置きます この 2 つのファイルを置くだけです Android.mk の具体的な記述方法は(NDK コンパイル) C/C++ プログラムの詳細説明を参照してくださいAndroid.mkを使用してコンパイルされたプロセス
次に、現在のディレクトリでターミナルを開き、NDK コンパイル コマンドを入力します。
/home/yinlong/Music/sdkapp/android-ndk-r14b-linux-x86_64/android-ndk-r14b/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk
現在のディレクトリに libs ファイルを生成でき、実行可能ファイルのバージョンが多数存在します。
私の imx6q および上記の 32 ビット システムに適した実行可能ファイルは、armeabi-v7a ディレクトリに配置されます。
実行可能ファイル test_app が表示されます。
iMX6q 開発ボードに入れて実行します。
上記のファイルを Android デバイス、つまり開発ボードに配置し、次のコマンドを実行してファイルの読み取りおよび書き込み権限を設定します。root 権限が必要であることに注意してください。
chmod 777 test_app
その後、NDK によってコンパイルされた実行可能ファイルを実行できます。
./test_app