1はじめに
以前の記事でJNK / NDKを紹介しました。NDK開発にAndroid.mkとApplication.mkのローカル構成を使用しました。しかし実際には、Android Studio 2.2以降、NDKコードをコンパイルするためにCMakeメソッドが追加されました。
2 CMake
CMakeは、単純なステートメントですべてのプラットフォームのインストール(コンパイルプロセス)を記述できるクロスプラットフォームインストール(コンパイル)ツールです。彼は、さまざまなメイクファイルまたはプロジェクトファイルを出力でき、UNIXでのautomakeと同様に、コンパイラでサポートされているC ++機能をテストできます。GoogleはNDKとCMakeを使用して、CおよびC ++コードをAndroid Studio 2.2以降のネイティブライブラリにコンパイルします。その中で、GradleはSOライブラリをAPKに簡単にカプセル化できます。
3こんにちは世界
初めてCMakeを使用する場合は、以前と同じようにNDKをインストールし、Android StudioのSDK管理ページでCMakeアイテムを確認してダウンロードします。操作は次のとおりです。
インストールが完了したら、ネイティブC ++プロジェクトを作成できます。[File] – [New Project]ポップアップウィンドウで、次のように[Include C ++ support]項目にチェックマークを付けます。
プロジェクトが作成された後、以下に示すように、通常のAndroidプロジェクトといくつかの違いがあることがわかります。
1. appディレクトリの下に追加の.externalNativeBuidlディレクトリがあります。
2.メインディレクトリの下に追加のcppディレクトリがあり、そこにC / C ++コードが配置されるnative-lib.cppファイルがあります。
3. appディレクトリのbuile.gradleのコンテンツには、さらに2つのアイテムがあります。最初の項目は、新しいプロジェクトの作成時に選択したC ++バージョンと、ティックの-fexceptionsおよび-frtti項目であることがわかります。これらは、例外サポート(-fexceptions)およびランタイムタイプ情報サポート(-frtti)です。 2番目の項目は、CMakeLists.txtファイルを指定することです。
4. appディレクトリに追加のCMakeLists.txtファイルがあり、その内容は次のとおりです。
3.1 CMakeLists.txt解说
上記のCMakeLists.txtファイルの内容を振り返ってみましょう。コメントには4行の有効なコードが残っています。その意味を見てみましょう。
cmake_minimum_required(VERSION major [.minor [.patch [.tweak]]] [FATAL_ERROR])
プロジェクトで必要なCMakeの最小バージョンを設定します。たとえば、上記の最小バージョンは3.4.1です。
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
ライブラリを追加します。上記のように、動的ライブラリnative-libをコンパイルすると、ソースファイルはsrc / main / cpp / native-lib.cppのみになります。パラメータの説明:
<name>は、指定した名前のライブラリファイルを追加することを意味します。
[STATIC | SHARED | MODULE]作成するライブラリのタイプ、STATIC(.aファイル、コンパイルに必要、Windowsのlibファイルに相当)に対応する静的ライブラリ、SHARED(.soファイル、ランタイムに対応する共有動的ライブラリ)を指定します必須、Windowsのdllファイルに相当)、MODULEはプロジェクトのモジュールに対応します。
[EXCLUDE_FROM_ALL]この属性を指定すると、ディレクトリの作成時に対応する属性の一部が設定されます。詳細については、対応するドキュメントを参照してください。
source1 source2 ... sourceNはソースファイルを指定します。
find_library(<VAR> name1 [path1 path2 ...])
ライブラリファイルを検索します。上記のように、コンパイル済みライブラリlog_libを探します。
target_link_libraries(<name> lib1 lib2 lib3)
指定されたライブラリをターゲットにリンクします。上記のように:事前にコンパイルされたライブラリlog_libを見つけ、動的ライブラリnative-libにリンクします。
3.2コードの説明
native-lib.cpp
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_zyx_cmakedemo_MainActivity_stringFromJNI(JNIEnv *env, jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Example of a call to a native method
TextView tv = findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
}
非常に単純なコードで、MainActivityの静的ブロックにlibnative-lib.soをロードしてから、ネイティブメソッドstringFromJNIを定義します。次に、native-lib.cppにstringFromJNIメソッドを実装します。関数名もJava_package name_class name_method nameのルールに従います。
3.3オペレーション
コンパイルして実行すると、対応するsoファイルがapp \ build \ middles \ cmake \ debug \ objディレクトリに生成されます。次に、電話でプログラムを実行すると、JavaがC ++コードを正常に呼び出し、結果が返されたことがわかります。
4外部soライブラリへの参照
実際の開発プロセスでは、多くの場合、C ++プロジェクトはAndroidプロジェクトから分離されているか、Androidプロジェクトは外部で提供されているライブラリファイルを直接参照しています。次に、これをシミュレーションしてみましょう。
以下に示すように、最初に上記のコンパイル済みsoファイルをapp \ src \ main \ jniLibsにコピーします。
次に、CMakeLists.txtの内容を次のように変更します。
cmake_minimum_required(VERSION 3.4.1)
add_library(native-lib SHARED IMPORTED)
set_target_properties(native-lib PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libnative-lib.so)
次の2行のコードは、動的ライブラリを追加し、soライブラリのパスを設定することを意味します。$ {CMAKE_SOURCE_DIR}はCMakeLists.txtが配置されているパス、$ {ANDROID_ABI}はカップタイプです。
変更後に再コンパイルして実行すると、表示結果は上記のソースコード統合と同じになります。
5詳細
NDKおよびCMakeの詳細については、以下を参照してください。
https://developer.android.com/ndk/guides/index.html
https://developer.android.com/ndk/guides/cmake.html。
https://www.zybuluo.com/khan-lau/note/254724
https://github.com/googlesamples/android-ndk
https://cmake.org/cmake-tutorial/