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変数開始LOCAL_PATH := $(call my-dir)
  • に続いてCLEAR_VARS変数include $(CLEAR_VARS)
  • 次LOCAL_MODULE変数は、出力するsoファイルの名前を定義します.デフォルトでは、出力するsoはlib+LOCAL_です.MODULE変数値+.so,変数値の前にlibがあると加算しない,あるいは変数値の後ろにある.xxxも、削除します.
  • 次はLOCAL_SRC_FILES変数は、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つが内蔵されています.
  • 以LOCAL_LOCAL_のように開始MODULE
  • はPRIVATE_で、NDK_, or APP
  • my-di
  • などの小文字
    カスタマイズするならMY_をお勧めしますはじめに.
    2.1 NDKデフォルトの変数
  • CLEAR_VARSは、新しいモデルを記述する前にこのスクリプトを導入するために使用され、前の値include $(CLEAR_VARS)
  • がクリアされます.
  • BUILD_SHARED_LIBRARY、システムを構築して声明のLOCALを収集することを教えます_変数の値は、so include $(BUILD_SHARED_LIBRARY)
  • に出力される.
  • BUILD_STATIC_LIBRARYとBUILD_SHARED_LIBRARYは似ていますが、project/packagesにコピーすることはありませんが、shared libraries用に提供することができ、出力されます.a include $(BUILD_STATIC_LIBRARY)
  • PREBUILT_SHARED_LIBRARYは、事前にコンパイルされた共有ライブラリを指定するために使用されますが、LOCAL_SRC_FILESはsoファイルinclude $(PREBUILT_SHARED_LIBRARY)
  • PREBUILT_STATIC_LIBRARYとPREBUILT_SHARED_LIBRARY類似
  • TARGET_ARCH略、ポイントはTARGET_ARCH_ABI
  • TARGET_PLATFORMは、現在コンパイルされているandroid apiバージョンTARGET_PLATFORM := android-22
  • を指定する.
  • TARGET_ARCH_ABIはcpuアーキテクチャを指定し、TARGET_ARCH_ABI := arm64-v8a
  • TARGET_ABI、android apiバージョン魚abiアーキテクチャを指定し、TARGET_ABI := android-22-arm64-v8a
  • 2.2 Module-Description Variables記述modelの変数
  • LOCAL_PATHは現在のファイルのパスを指定し、ファイルの開始時にLOCAL_PATH := $(call my-dir)を指定する必要があります.CLEAR_に注意してください.VARSは、この値
  • をクリアしません.
  • LOCAL_MODULE
  • LOCAL_MODULE_FILENAMEは、生成されたsoファイルの名前
  • を指定することができる
  • LOCAL_SRC_FILESは、このモデルに対応するオリジナルファイル
  • を指定する
  • LOCAL_CPP_EXTENSION構成c++ファイル接尾辞(拡張子)、c++、ccまたはその他の
  • LOCAL_CPP_FEATURESは、RTTI(RunTime Type Information)をサポートするなどの特定のc++特性を指定し、LOCAL_CPP_FEATURES := rtti
  • 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_LDLIBS := -lz
  • 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では、
    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パラメータフォーマット-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作成
  • 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 )

    個人的な理解では、
  • 最初はlibライブラリの別名で、私たちがこのファイルの他の場所で使用するものです.
  • の2番目のパラメータは対応するnative libライブラリの名前で、2番目のパラメータはndk-bundle/platforms/androidバージョン/以下で見つかります.上記のsoファイル生成規則によればlib name
  • を明確に提案できる.
    次に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 )
  • lib name
  • タイプ
  • ファイルパス
  • その他の事前構築librariesの追加
    これらはすでにあるので、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 )
  • lib name
  • 指定パラメータ
  • soのパス
  • を指定する
    この場合include_が必要ですdirectoriesはsoに対応するヘッダファイルのパスを指定します.
    6.まとめ
    理解の誤りがあって、みんなは指摘して、共に勉強して共に進歩します.
    参考資料:
  • Android.mk、ドキュメント
  • Application.mkドキュメント
  • Androidドキュメントcmakeドキュメント
  • Android studioで紹介されている