android studio 2.2 C++ 支援(CMAKE方法)
上次學到了約束佈局,現在繼續學習android studio 2.2使用CMAKE編譯C++,並支援在C++打斷點,寫C++程式碼時也支援打斷點。學習的時候是使用了國外的一篇部落格的程式碼:http://bhirawa87.my.id/blog/android-studio-cmake/
首先還是簡單介紹一下Cmake.Cmake是一個構建工具,在不同的平臺上是不同的構建工具 如:GNU Make ,QT 的 qmake ,微軟的 MS nmake,BSD Make(pmake),Makepp,等等。CMake是為了達到一次編寫MAKEFile,則可以在不同的平臺上編譯的目的編寫的一款構建工具。我現在也不是太懂,以後學習一下,並寫個CMake自學教程來。這裡有個網站
切入正題。首先建立一個空工程,然後新增NDK目錄(沒有新增的話,在下面新增CMakeLists.txt的路徑的時候回報錯),新增的方法是右鍵開啟模組設定,然後填寫NDK的路徑,如下圖:
接下來是連線到C++工程(翻譯過來的,不知道是不是這樣叫),右鍵模組的名字,然後點選“Link C++ Project with Gradle”,在這裡會要求填寫CMakeList.txt的路徑,你把檔案的路徑填寫進去就可以了。
好了,該寫程式碼了:
1 首先是在main下面建立cpp資料夾,然後編寫編譯檔案CMakeLists.txt的編寫:
cmake_minimum_required(VERSION 2.8.7)
add_library(hello-jni SHARED hello-jni.c)
target_link_libraries(hello-jni log android)
NOTE:android studio 2.2自帶的CMake的版本是3.4的
2 編寫hello-jni.c的程式碼:
#include <string.h>
#include <jni.h>
jstring
Java_com_example_jaimeyang_nativecmaketest_MainActivity_stringFromJNI( JNIEnv* env,
jobject thiz )
{
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#if defined(__ARM_PCS_VFP)
#define ABI "armeabi-v7a/NEON (hard-float)"
#else
#define ABI "armeabi-v7a/NEON"
#endif
#else
#if defined(__ARM_PCS_VFP)
#define ABI "armeabi-v7a (hard-float)"
#else
#define ABI "armeabi-v7a"
#endif
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#elif defined(__x86_64__)
#define ABI "x86_64"
#elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */
#define ABI "mips64"
#elif defined(__mips__)
#define ABI "mips"
#elif defined(__aarch64__)
#define ABI "arm64-v8a"
#else
#define ABI "unknown"
#endif
return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI ".");
}
3 此時在除錯的時候你會發現在選擇除錯目標那裡出現了紅叉,然後執行的時候,提示”package id lldb not found:2.2”類似的提示,開啟SDK管理器更新把lldb更新到2.2的版本,在C++程式碼中打個斷點,此時發現可以進入斷點,OK,大功告成。。。。
忘記說一個了,在android studio2.2中模擬器的速度快了很多,估計是因為使用了因特爾HAXM的驅動,並且使用了X86的映象,如果你覺得模擬器太慢了,也可以試一試。。。