2016-06-22 7 views
4

私はC++でチェスエンジンを書いていましたが、これはアプリ "Chess for Android"でコンパイルするためにコンパイルしたいものです。C++のコンソールプログラムをアンドロイドプロセスとしてコンパイルするにはどうすればいいですか?

Finally, developers can do all development in C/C++ and generate stand-alone native code using the appropriate compiler toolchain (e.g. CodeSourcery for ARM or the toolchain that ships with the NDK). This third approach is used by Chess for Android to import engines that do not ship with the application.

チェスエンジンは簡単プログラムである:ここでは

very very crudelyが彼のアプリ上でサードパーティ製のチェスエンジンを実行する方法について説明し、アプリの作者からのポストからの抜粋です。アプリケーションが実行され、ユーザーがコマンドを送信すると、プログラムは思考し、最良の移動の詳細を示す文字列を吐き返します。

グラフィックスなどのアプリは必要ありません。それはstdin/stdout経由で(パイプ経由で)実際に通信されるプロセスだけです。 「Chess for Android」アプリは、プロセスとの会話を担当します。私は、「Chess for Android」アプリで実行できるプロセスとして、自分のエンジンをどのように取得するのかを理解する必要があります。

答えて

0

私は、キー文は、このページに発見されたと思う:UCI and XBoard Engines for Android

For x86-based Android devices (such as Google TV), any engine binary that has been compiled for 32-bit x86 Linux will work. This format is widely available for many chess engines.

彼らはLinux用にコンパイルしているかのようアンドロイド用チェスエンジンを使用できることを意味しています。これはあまりにも驚くべきことではありません。なぜなら、AndroidはLinuxをベースにしており、ネイティブLinux APIが利用できるからです。 Android用チェスは、これらのAPIを使用してエンジンを通常のLinuxネイティブ実行ファイルとして実行しています。

32ビットLinux x86システムがあり、Androidデバイスがx86デバイスの場合は、ローカルで使用しているかのように、Linuxシステムでエンジンをコンパイルし、そのデバイスにインストールします。リンクしたページ

しかし、お使いのAndroidデバイスはおそらくx86デバイスではないため、おそらくARMデバイスです。その場合、ARMをターゲットとするLinux実行可能ファイルにコンパイルできるクロスコンパイラが必要です(これについては、引用した部分で簡単に説明しています)。クロスコンパイラは、ネイティブコンパイラと同じ方法でコードをコンパイルしますが、結果の実行可能ファイルには、コンピュータに搭載されているx86チップではなく、ARMチップ用のマシン命令があります。

あなたは(おそらく)Windows上で開発しているので、おそらくAndroid NDKクロスコンパイラを使うのが最も便利でしょう。 NDKを実際に使用するための手順のほとんどは、Androidアプリケーション用のネイティブライブラリを作成していないため、通常のLinux実行可能ファイルを作成しているため、関連しないことに注意してください)。

NDKには、gccのクロスコンパイラツールチェーンが含まれています。これを使用してネイティブの.exeをビルドします。あなたのPATHに、gccコンパイラフロントエンドを含むNDKのフォルダが含まれていることを確認してください。あなたのエンジンのソースコードは、ファイルの呼び出しengine.ccである場合次に、あなたはいくつかのより多くの環境変数と実際のコマンドを設定する必要があり

gcc -o MyUCIEngine engine.cc 

のようなコマンドでARMのバイナリにそれをコンパイルすることができるはずですビルドを行うことはより複雑になります。 This pageには、NDKでクロスコンパイルツールチェーンを実行するために必要な追加情報があります。

+0

ご返信ありがとうございます。私はNDKをダウンロードしました。PATH変数にルートフォルダを設定しました。私は今私のプログラムをコンパイルしようとしていますが、いくつかのヘッダーがありませんか?それは "致命的なエラー:iostream:No such file or directory #include "と書かれています。も同じです。私はここにあるコンパイラ(?)を使用しています:toolchains \ arm-linux-androideabi-4.9 \ prebuilt \ windows \ bin \ arm-linux-androideabi-gcc-4.9これをどうやって解決するのですか?申し訳ありませんが、これは簡単ですが、私は本当に何をすべきかわからないし、過去20分間の回答を研究しようとしています – user2936448

+0

@antlersoft Desktop Linux x86バイナリは、互換性のない、またはAndroid x86のものと互換性がありません。どちらのシステムもLinuxカーネルを使用していますが、違いはほとんどありません。まずAndroidはGlibcの代わりにBionic libcを使い、100%API互換ではないので、AndroidはELFの '/ system/bin/linker'のために完全に別のインタプリタを使います。デスクトップバイナリもロードされません。/lib/ld-linux.so.2'を実行します。また、ハンドヘルドデバイスは、デスクトップデバイスABIとは異なるABIを使用してもよい。 – Sergio

+0

@ user2936448 - コンパイラのコマンドラインで-sysrootフラグを正しく設定していないようなエラーが表示されます。 – antlersoft

3

Android用の従来のコンソールプログラムは、2つの方法で構築できます。

  1. ndk-buildシステムの使用。Application.mk

    APP_ABI := armeabi-v7a 
    APP_PLATFORM := android-16 
    APP_STL := stlport_static 
    NDK_TOOLCHAIN_VERSION := 4.8 
    

    Android.mk:あなたは2つの余分なファイルを作成する必要が

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := <executable_name> 
LOCAL_LDLIBS := -llog -lm # whatever libs you need 
LOCAL_CFLAGS := -O3 -UNDEBUG # so on 
LOCAL_C_INCLUDES := <list of a non-standard header directories> 
LOCAL_SRC_FILES := <sources> 
include $(BUILD_EXECUTABLE) # build executable instead of library 

前者はAndroidのレベル、STLの実装をターゲットと、ターゲットのABIについて説明し、ツールチェーンを構築する選択します。後者はそれ自体がsimpe makefileであり、混乱してはいけません。そして、あなたは、次のコマンドでビルドを開始することができdetais ためhereを参照してください:

$ ndk-build NDK_PROJECT_PATH=path/to/intermediate/results/dir NDK_LIBS_OUT=path/to/output/dir APP_BUILD_SCRIPT=path/to/Android.mk NDK_APPLICATION_MK=path/to/Application.mk 

また、ndk-buildはデフォルトでいくつかのフラグを追加することに注意してください。これを確認するには - 上記のコマンドラインにV=1を追加してください。

  1. スタンドアロンツールチェーンの使用。

この方法は、既にプロジェクト用のビルドシステムがあり、クロスコンパイラのみが必要な場合に便利です。例えば、次の実行toochainスタンドアロンを準備するには:今

$NDK/build/tools/make-standalone-toolchain.sh --arch=arm --platform=android-21 --install-dir=/tmp/my-android-toolchain 

とエクスポートパスをツールに:

$ export PATH=/tmp/my-android-toolchain/bin:$PATH 
$ export CC=arm-linux-androideabi-gcc 
$ export CXX=arm-linux-androideabi-g++ 

詳細情報hereを。

+0

お返事ありがとうございました。あなたの最初の方法を使用して、数時間の試行錯誤の後でコード修正と共に実行可能ファイルを構築することができました。コンパイルしようとするともう一つの不快なエラーがありました。コンパイラが何らかの理由で望んでいたディレクトリなので、/ windows-/folderを/ windows-x86_64 /という名前に変更しなければなりませんでした。私のアプリケーションは彼のアプリからロードすることができます、そして、それは著者として私の名前を払い戻すので、それがある程度は機能していることを知っていますが、エンジンを使用しようとする何らかの理由でクラッシュします。 – user2936448

+0

@ user2936448クラッシュした場合 - 最初にデバイスのlogcatを確認してください。それは '*** *** *** *** *** *** *** *** *** *** ***で始まるクラッシュログを含むべきです。 ** *** *** '署名。 – Sergio

関連する問題