Android JNI学習ノート(三)-ファイルをコンパイルAndroid.mk、Application.mkとcamke
8816 ワード
1.はじめに
android 2.2では、cmakeコンパイルが入っていますが、以前はAndroidを使っていました.mk、Application.mkの、今日は彼らの構成オプションを記録します.
2. Android.mk
Android.mkはjniディレクトリの下で、システムを構築するソースファイルおよびshared librariesを記述するために使用されます.ファイル形式は次のとおりです.以LOCAL_PATH変数開始 に続いてCLEAR_VARS変数 次LOCAL_MODULE変数は、出力するsoファイルの名前を定義します.デフォルトでは、出力するsoはlib+LOCAL_です.MODULE変数値+.so,変数値の前にlibがあると加算しない,あるいは変数値の後ろにある.xxxも、削除します. 次はLOCAL_SRC_FILES変数は、 などの元のファイルパスを宣言します.の最後の行は、システムの構築を支援します.
もちろん、上は最も簡単なものですが、他の変数とマクロについて説明します.
構築システムには多くの変数とマクロが用意されています.もちろん、カスタマイズも可能です.以下の3つが内蔵されています.以LOCAL_LOCAL_のように開始MODULE はPRIVATE_で、NDK_, or APP my-di などの小文字
カスタマイズするならMY_をお勧めしますはじめに.
2.1 NDKデフォルトの変数 CLEAR_VARSは、新しいモデルを記述する前にこのスクリプトを導入するために使用され、前の値 がクリアされます. BUILD_SHARED_LIBRARY、システムを構築して声明のLOCALを収集することを教えます_変数の値は、so に出力される. BUILD_STATIC_LIBRARYとBUILD_SHARED_LIBRARYは似ていますが、project/packagesにコピーすることはありませんが、shared libraries用に提供することができ、出力されます.a PREBUILT_SHARED_LIBRARYは、事前にコンパイルされた共有ライブラリを指定するために使用されますが、LOCAL_SRC_FILESはsoファイル PREBUILT_STATIC_LIBRARYとPREBUILT_SHARED_LIBRARY類似 TARGET_ARCH略、ポイントはTARGET_ARCH_ABI TARGET_PLATFORMは、現在コンパイルされているandroid apiバージョン を指定する. TARGET_ARCH_ABIはcpuアーキテクチャを指定し、 TARGET_ABI、android apiバージョン魚abiアーキテクチャを指定し、 2.2 Module-Description Variables記述modelの変数 LOCAL_PATHは現在のファイルのパスを指定し、ファイルの開始時に をクリアしません. LOCAL_MODULE LOCAL_MODULE_FILENAMEは、生成されたsoファイルの名前 を指定することができる LOCAL_SRC_FILESは、このモデルに対応するオリジナルファイル を指定する LOCAL_CPP_EXTENSION構成c++ファイル接尾辞(拡張子)、c++、ccまたはその他の LOCAL_CPP_FEATURESは、RTTI(RunTime Type Information)をサポートするなどの特定のc++特性を指定し、 LOCAL_C_INCLUDES指定パスリスト、ndkに対するフォローパス LOCAL_CFLAGS、LOCAL_CPPFLAGSは、追加のマクロ定義およびコンパイルオプション を指定することができる LOCAL_STATIC_LIBRARIES、LOCAL_SHARED_LIBRARIES指定他のstatic libraries、shared libraries LOCAL_WHOLE_STATIC_LIBRARIES全体. LOCAL_LDLIBS指定システム-l指定システムライブラリ、例えば/system/lib/libz.so LOCAL_LDFLAGS略、 が読めなかった LOCAL_ALLOW_UNDEFINED_SYMBOLSのデフォルトでは、コンストラクションシステムが未定義のリファレンスに遭遇して共有を確立しようとすると、未定義のシンボルエラーが放出されます.このエラーはdebugを助けることができます. 残りの多くはあまり使われていませんが、しばらくここまで来て、後で使う機会があれば、ドキュメントを調べましょう.
3. Application.mk
appに必要なnative modelを記述するために使用されます.
3.1変数 APP_PROJECT_PATHという変数はアプリケーションのプロジェクトルートディレクトリの絶対パスを格納する. APP_OPTIM構成releaseとdebug APP_CFLAGSという変数は、システムを構築するCコンパイラフラグのセットをコンパイラがCまたはc++ソースコードをコンパイルする任意のモジュールに渡し、Androidを変更することなくアプリケーションに必要な構築モジュールを変更することができる.mkファイル APP_CPPFLAGSとAPP_CFLAGS類似 APP_LDFLAGS A set of linker flags that the build system passes when linking the application、shared librariesとexecutablesに対してのみ有効 APP_BUILD_SCRIPT指定Android.mkファイル APP_ABI指定abi APP_PLATFORM指定android apiバージョン APP_STLリンク他のc++は をサポートする NDK_TOOLCHAIN_VERSION gccコンパイルバージョン APP_PIE APP_THIN_ARCHIVE
4.Android Studioでの使用
Android Studio 2.2以上を要求します.
gradleでは、
私たちが書く必要があるのは、上の3つの注釈のある場所です. cmakeパラメータフォーマット-D+Variable name=Argumentsの情勢 ANDROID_TOOLCHAIN cmakeコンパイルチェーン、gccとclang(デフォルト)の2種類の ANDROID_PLATFORM target Android platform ANDROID_STL cmakeコンパイル時にどのstlを使うか、以下の種類のHelper Runtimes があります. ANDROID_PIEは、位置が独立した実行可能(餅)を使用するかどうかを指定します.Androidのダイナミックリンクは、Android 4.1(APIレベル16)以上でサポートされています. ANDROID_CPP_FEATURESは、特定のc++プロパティCMakeのコンパイル時に、c++RTTI(ランタイムタイプ情報)や例外などのローカルライブラリを使用する必要があることを指定します.rtti,exceptions ANDROID_ALLOW_UNDEFINED_SYMBOLSは、CMakeが未定義の参照に遭遇した場合、未定義のシンボルエラーを投げ出すかどうかを指定し、ローカルライブラリを構築します.これらのタイプのエラーを無効にし、この変数をTRUEに設定します. ANDROID_ARM_MODEは生成されたバイナリファイルarmまたはthumbモードを設定し、thumbモードでは各命令は16 bits、armモードでは32ビット、デフォルトではthumb である. NDROID_ARM_NEON build native libが をサポートしているかどうか ANDROID_DISABLE_NO_EXECUTEがne bitを許可するか、または実行するか、または安全に特訓した ANDROID_DISABLE_RELROは、 を読み取り専用かどうか ANDROID_DISABLE_FORMAT_STRING_CHECKSは、フォーマット文字列とソースコードをコンパイルするかどうかの保護を指定します.有効にすると、コンパイラはprintf-style関数を一定のフォーマット文字列で使用していない場合にエラーを投げ出します.
ndk abifilters cmake path
cmakeパラメータについて、公式ドキュメント
5. CMakeLists.txt作成 を指定する.
native apiの追加
個人的な理解では、最初はlibライブラリの別名で、私たちがこのファイルの他の場所で使用するものです. の2番目のパラメータは対応するnative libライブラリの名前で、2番目のパラメータはndk-bundle/platforms/androidバージョン/以下で見つかります.上記のsoファイル生成規則によればlib name を明確に提案できる.
次にtarget_を使用しますlink_libraries(native-lib,${log-lib})は私たちのローカルライブラリとndkにあるローカルライブラリをリンクします.
ソースコードを追加することもできます. lib name タイプ ファイルパス その他の事前構築librariesの追加
これらはすでにあるので、IMPORTEDでcmkaeに伝える必要があります.このlibを私たちのプロジェクトに導入するだけです.
そしてset_を使う必要がありますtarget_propertiesはパスを指定します. lib name 指定パラメータ soのパス を指定する
この場合include_が必要ですdirectoriesはsoに対応するヘッダファイルのパスを指定します.
6.まとめ
理解の誤りがあって、みんなは指摘して、共に勉強して共に進歩します.
参考資料: Android.mk、ドキュメント Application.mkドキュメント Androidドキュメントcmakeドキュメント Android studioで紹介されている
android 2.2では、cmakeコンパイルが入っていますが、以前はAndroidを使っていました.mk、Application.mkの、今日は彼らの構成オプションを記録します.
2. Android.mk
Android.mkはjniディレクトリの下で、システムを構築するソースファイルおよびshared librariesを記述するために使用されます.ファイル形式は次のとおりです.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello.cpp
include $(BUILD_SHARED_LIBRARY)
もちろん、上は最も簡単なものですが、他の変数とマクロについて説明します.
構築システムには多くの変数とマクロが用意されています.もちろん、カスタマイズも可能です.以下の3つが内蔵されています.
カスタマイズするならMY_をお勧めしますはじめに.
2.1 NDKデフォルトの変数
include $(CLEAR_VARS)
include $(BUILD_SHARED_LIBRARY)
include $(BUILD_STATIC_LIBRARY)
include $(PREBUILT_SHARED_LIBRARY)
TARGET_PLATFORM := android-22
TARGET_ARCH_ABI := arm64-v8a
TARGET_ABI := android-22-arm64-v8a
LOCAL_PATH := $(call my-dir)
を指定する必要があります.CLEAR_に注意してください.VARSは、この値LOCAL_CPP_FEATURES := rtti
LOCAL_LDLIBS := -lz
3. Application.mk
appに必要なnative modelを記述するために使用されます.
3.1変数
4.Android Studioでの使用
Android Studio 2.2以上を要求します.
gradleでは、
android {
defaultConfig {
externalNativeBuild {
cmake {
// cmake "-DVAR_NAME=VALUE"
arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"
}
}
// abi
ndk {
abiFilters "armeabi","x86","armeabi-v7a"
}
}
buildTypes {...}
externalNativeBuild {
cmake {
// CMakeLists.txt
path 'src/main/jni/CMakeLists.txt'
}
}
}
私たちが書く必要があるのは、上の3つの注釈のある場所です.
cmakeパラメータについて、公式ドキュメント
5. CMakeLists.txt作成
cmake_minimum_required(VERSION 3.4.1)
cmakeの最小バージョンadd_library(native lib name,SHARED(SHARED STATIC),c++ c )
include_directories(src/main/cpp/include/)
ヘッダファイルパスnative apiの追加
find_library( # Defines the name of the path variable that stores the
# location of the NDK library.
log-lib
# Specifies the name of the NDK library that
# CMake needs to locate.
log )
個人的な理解では、
次にtarget_を使用しますlink_libraries(native-lib,${log-lib})は私たちのローカルライブラリとndkにあるローカルライブラリをリンクします.
ソースコードを追加することもできます.
add_library( app-glue
STATIC
${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )
これらはすでにあるので、IMPORTEDでcmkaeに伝える必要があります.このlibを私たちのプロジェクトに導入するだけです.
add_library( imported-lib
SHARED
IMPORTED )
そしてset_を使う必要がありますtarget_propertiesはパスを指定します.
set_target_properties( # Specifies the target library.
imported-lib
# Specifies the parameter you want to define.
PROPERTIES IMPORTED_LOCATION
# Provides the path to the library you want to import.
imported-lib/src/${ANDROID_ABI}/libimported-lib.so )
この場合include_が必要ですdirectoriesはsoに対応するヘッダファイルのパスを指定します.
6.まとめ
理解の誤りがあって、みんなは指摘して、共に勉強して共に進歩します.
参考資料: