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:そのようなファイルまたはディレクトリはありません
これを機能させるにはどうすればよいですか?
私が理解しているように、正しい方法は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>
に応答して
静的ライブラリ(.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
クールなトリック:Android.mkファイルがある場合は、ビルドタイプを以下から変更できます。
include $(BUILD_SHARED_LIBRARY)
に
include $(BUILD_STATIC_LIBRARY)
ライブラリをndkビルドすると、.aライブラリがobj /フォルダーにそれぞれのアーキテクチャに出力されます。