web-dev-qa-db-ja.com

Android NDKを使用して静的ライブラリをコンパイルする方法は?

Androidで使用する静的ライブラリをコンパイルしようとしていますが、コンパイル方法がわかりません。ライブラリは標準ライブラリ(stdio.hなど)とlibxml2を使用しています。 。

Arm-eabi-gccを使用してコンパイルしようとしていますが、次のエラーが表示されます。

/cygdrive/c/Android-ndk-r4/build/platforms/Android-8/Arch-x86/usr/include/asm/posix_types.h:15:28:エラー:posix_types_64.h:そのようなファイルまたはディレクトリはありません

これを機能させるにはどうすればよいですか?

34
Reimund

私が理解しているように、正しい方法はndk-buildを使用し、コンパイラを直接呼び出さないことです。

Android.mkでは、コンパイルする静的ライブラリごとにモジュールを指定し、共有ライブラリで使用するように指定する必要があります。

Hello-jniサンプルプロジェクトの変更されたAndroid.mkファイルの例:

LOCAL_PATH := $(call my-dir)

# Define vars for library that will be build statically.
include $(CLEAR_VARS)
LOCAL_MODULE := <module_name>
LOCAL_C_INCLUDES := <header_files_path>
LOCAL_SRC_FILES :=  <list_of_src_files>

# Optional compiler flags.
LOCAL_LDLIBS   = -lz -lm
LOCAL_CFLAGS   = -Wall -pedantic -std=c99 -g

include $(BUILD_STATIC_LIBRARY)

# First lib, which will be built statically.
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_STATIC_LIBRARIES := <module_name>
LOCAL_C_INCLUDES := <header_files_path>
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

Ndk-buildを実行するときにどのモジュールをコンパイルするかを制御したい場合は、Application.mkファイル(Android.mkと同じディレクトリに)を作成し、次のようにすべてのモジュールを一覧表示できます。例:

APP_MODULES := <module_name_1> <module_name_2> ... <module_name_n>
47
Reimund

に応答して

静的ライブラリ(.aファイル)を、それを使用する共有ライブラリなしで生成できますか?

(これは本当に独自の質問であるべきでした)、答えはイエスです。

デフォルトでは、NDKは実行可能ファイルと共有ライブラリのみをビルドします(もちろん依存関係もあります)。ただし、Application.mkで明示的に参照することにより、NDKにスタンドアロンの静的ライブラリを構築させることができます。

静的ライブラリモジュールがLOCAL_MODULE:= libXYZであると仮定して、次の行をApplication.mkに追加します(存在しない場合は、Android.mkと同じフォルダーにファイルを作成します)。

APP_MODULES := XYZ

APP_MODULES値には、静的ライブラリモジュール名に含まれるlibプレフィックスが含まれないことに注意してください。

あるいは、Application.mkを作成したくない場合は、コマンドラインで値を指定できます:ndk-build APP_MODULES=XYZ

9
adelphus

クールなトリック:Android.mkファイルがある場合は、ビルドタイプを以下から変更できます。

include $(BUILD_SHARED_LIBRARY)

include $(BUILD_STATIC_LIBRARY)

ライブラリをndkビルドすると、.aライブラリがobj /フォルダーにそれぞれのアーキテクチャに出力されます。

3
Lake