1

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

その間、ライブラリ、デモ、および実際のデーモンをコンパイルするためにcmakeを使用しています(ところで、これは正常に動作します)。私は今、2つの異なることをしようとしています:

  1. を使用して同じアプリをビルドしますndk-build
  2. C++ デーモンの動作と非常によく似た JNI 呼び出しを作成して、C++ デーモンを Android サービスに移植します。

私が理解している限りでndk-buildは、ネイティブ アプリケーションを作成することはできませんが、Java GUI によってロードできるネイティブ ライブラリのみを作成できます。正しいですか? ステップ 1 では、Java は実際には必要ありません (すでに証明済みです) が ndk-build、elf アプリケーションを吐き出す方法をまだ見つけています。

参考までに-ここで説明されているように、私はcmakeを使用しています:http://opekar.blogspot.com/2011/06/android-cmake-is-much-easier-in-ndk-r5b.html

このようにして、「通常の」Linux用のビルドと、ソースビルドを使用したAndroid用のビルドを作成できます。あなたが私に尋ねると、とてもいいハックです。

4

3 に答える 3

2

別の方法は、NDK にバンドルされているスクリプトを使用してmake-standalone-toolchain.shスタンドアロンのツールチェーンを作成し、それを使用してプロジェクトをコンパイルすることです。以下のシェル コードは、その使用方法を示しています。

# 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

# Create folder if it doesn't already exist.
mkdir -p $folder

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

上記の行を実行すると、新しいスタンドアロン ツールチェーンが に生成さ$HOME/bin/android-14-ndk-4.7れ、通常の C/C++ クロス コンパイル ツールチェーンとして使用できます。

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

于 2013-07-22T19:16:36.607 に答える
1

コメントの 1 つで @Mārtiņš Možeik が述べたように、この写真Android.mkは機能します。

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)

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

インターネットでこの機能のドキュメントを見つけられなかったので、さらにいくつかの言葉:

  • これは非常にうまく機能します。ここでは問題ありません:)
  • これは、という名前のファイルに保存する必要がありますjni/Android.mk
  • コードは JNI ディレクトリ内に保存する必要があります
  • コードがjniディレクトリの外にある場合、これは見苦しくなりますが、不可能ではありません。コードに対応するプレフィックスを付けるだけで済みます。インクルード パスも変更することを忘れないでください。これは演習として読者に任せます。
  • Android ビルド システムから生成されたコードが によって生成されたコードよりも大きい理由はまだわかりませんcmakestrip前に、それは呼び出されないと言いましたが、*.so がlibディレクトリにコピーされる前に呼び出されます。
  • そのバイナリをAndroidパッケージにパッケージ化する方法はまだわかりません.Androidコードを変更せずに実行する方法もわかりません(たとえば、システムが起動している場合)。起動時に起動してからexecvpデーモンを実行する Java サービスを作成できると思います。
于 2012-04-22T09:38:17.547 に答える
0

あなたのオプション2は、知る限りそれを行う唯一の方法です.

于 2012-04-22T08:16:45.980 に答える