2012-04-22 8 views
1

Androidでネイティブデーモンを構築しようとしています。特定のハードウェアとJavaアプリケーションを制御する目的は、ソケットを使用してこのデーモンと通信できるようになります。NDKビルドC++専用アプリケーション

私はcmakeを使ってライブラリ、デモ、そして本当のデーモンをコンパイルしています。私は今、2つの異なることをしようとしています。

  1. ndk-buildを使って同じアプリを構築します。
  2. C++デーモンがAndroidサービスに移植されるようにするには、JNIコールをC++デーモンの動作とよく似てください。私の知る限り理解し、ndk-buildが今度はJavaのGUIによってロードすることができ、ネイティブアプリケーションが、唯一のネイティブライブラリを作ることができない...私は修正しています

? step1のために私は本当にjavaを必要としません(そして私はすでにそれを証明しています)が、まだndk-buildのelfアプリケーションを吐く方法を見つけました。参考のため

- ここで説明したように、私は、cmakeの使用しています:私が持つことができるhttp://opekar.blogspot.com/2011/06/android-cmake-is-much-easier-in-ndk-r5b.html

この方法では、「通常の」Linux用のビルドをし、またAndroidのソースのビルドのうち、使用して。あなたが私に尋ねるとかなり良いハック。

答えて

1

コメントの一つに、@マルティンスMožeikで述べたように、Android.mkのこのPICEが動作します:ながら、私は通知を行う

LOCAL_PATH  := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE  := my_daemon 
LOCAL_C_INCLUDES := src 
LOCAL_SRC_FILES := src/daemon.c 
include $(BUILD_EXECUTABLE) 

一つのことは、この「メイクファイル」によって生成されたバイナリが130Kであるということですcmakeによって生成されたバイナリは約40kbであった。これは-sC_FLAGとして使用し、gccが生成されたオブジェクトをオンザフライで削除するためです。これは後で$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-stripまたはあなたのアーチに対応するストリップを呼び出すことによって行うことができます。

私はインターネット上でこの機能の文書を発見していないとして、いくつかのより多くの単語:

  • これはかなり良い作品、これはjni/Android.mkと呼ばれるファイルに保存する必要があります:)
  • ここで問題ありません。
  • あなたのコードは、これは醜いが、不可能ではない取得jniディレクトリの外にある場合、コード JNIディレクトリ
  • 内に保存されなければなりません。コードに対応する接頭辞を付けるだけで、インクルードパスも変更することを忘れないでください。これは練習として読者に任されています。
  • まだAndroidビルドシステムから生成されたコードがcmakeによって生成されたコードよりも大きいことが分かりません。以前はstripは呼び出されていませんが、* .soがlibディレクトリにコピーされる前に呼び出されていました。
  • このバイナリをアンドロイドパッケージにパッケージする方法や、Androidコードを変更せずに(システムの起動時など)実行する方法さえも知らない私は起動時に起動するJavaサービスを作成してからexecvpデーモンを作成できると仮定します。
+0

Bionic(Android libc)はC++例外処理のサポートが限られているので、ポートを再考する必要があるかもしれません。 Ref:http://en.wikipedia.org/wiki/Bionic_%28software%29 – Samveen

0

オプション2はAFAIKを実行する唯一の方法です。

+0

私はバイナリを吐き出すためのビルドシステムをハッキングするオプションに反対していません。 – elcuco

+0

@エリューコ:私はまだアンドロイド自体をハッキングせずにその可能性は考えていない。 – Goz

+0

"$ NDK/build/code/build-biary.mk"とは何ですか? – elcuco

2

代わりに、make-standalone-toolchain.shをNDKにバンドルしてスタンドアロンツールチェーンを作成し、それを使用してプロジェクトをコンパイルします。以下のシェルコードはそれを使用する方法を示しています。あなたはどの通常のC/C++クロスコンパイルツールチェーンとして使用できる、$HOME/bin/android-14-ndk-4.7で新しいスタンドアロンツールチェーンが生成されます上記の行を実行

# Assumed path to the NDK, change it to suit your environment. 
NDK_HOME=$HOME/bin/android-ndk-r8e 

# Desired API and NDK versions and destination folder of 
# the stand-alone toolchain, change them to suit your needs. 
api=14 
ver=4.7 
folder=$HOME/bin/android-$api-ndk-$ver 

mkdir $folder 
cd $folder 

$NDK_HOME/build/tools/make-standalone-toolchain.sh \ 
    --toolchain=arm-linux-androideabi-$ver \ 
    --platform=android-$api --install-dir=$(pwd) 

スタンドアローンのツールチェーンを使用する利点は、Android向けのLinuxプロジェクトをクロスコンパイルして簡単にできることです。たとえば、私のport of Valgrind to Android ARMv7を参照してください。

関連する問題