Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發環境 >> Android Studio下NDK開發該如何配置

Android Studio下NDK開發該如何配置

編輯:Android開發環境

  1. 准備工作

  在實際寫代碼之前,首先我們還是需要做一些准備工作:

  1)下載NDK開發包:Android官方下載頁面

  2)配置系統環境變量

  下載好NDK開發包之後,直接解壓到任意目錄,然後需要配置一下系統環境變量,之所以要配置環境變量,是為了方便使用命令ndk-build腳本進行NDK編譯。配置參考如下:

  • Windows系統配置

         • 環境變量 PATH 下追加 :D:\ProgramFile\android-ndk-r11c-windows-x86_64;

  • MacOS系統配置

         • 在mac系統下打開終端,輸入:

           >touch .bash_profile

           >open -e .bash_profile

           這樣會彈出一個“.bash_profile”文件.

         • export ANDROID_HOME=/Users/edwin/Library/Android/sdk/

            export PATH=${PATH}:${ANDROID_HOME}ndk-bundle

  2. 項目配置

  使用Android Studio開發前我們也要做點額外工作,我們需要在項目根目錄下local.properties中添加編譯NDK的路徑:ndk.dir=/Users/liangqi/android-ndk

  • 創建Android.mk

  Android.mk文件用來指定源碼編譯的配置信息,例如工作目錄,編譯模塊的名稱,參與編譯的文件等,大致內容如下:

XML/HTML代碼
  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. LOCAL_MODULE := hello_jni  
  4. LOCAL_SRC_FILES := hello_jni.c  
  5. include $(BUILD_SHARED_LIBRARY)  

  LOCAL_PATH:設置工作目錄,而my-dir則會返回Android.mk文件所在的目錄。

  CLEAR——VARS:清除幾乎所有以LOCAL——PATH開頭的變量(不包括LOCAL_PATH)。

  LOCAL_MODULE:用來設置模塊的名稱。

  LOCAL_SRC_FILES:用來指定參與模塊編譯的C/C++源文件名。

  BUILD_SHARED_LIBRARY:作用是指定生成的靜態庫或者共享庫在運行時依賴的共享庫模塊列表。

  • 創建Application.mk

  這個文件用來配置編譯平台相關內容,我們最常用的估計只是APP_ABI字段,它用來指定我們需要基於哪些CPU架構的.so文件,當然你可以配置多個平台:

  APP_ABI := armeabi armeabi-v7a x86 mips

  • 使用gradle腳本

  當然該機器做的事我們還是盡量讓機器來做,因此,接下來我打算使用build.gradle來添加一些配置,讓Gradle自動幫我完成編譯工作,這簡直就是爽歪歪啦!

  使用gradle,你再也不用手動添加Android.mk和Application.mk文件,一切在build.gradle文件中就都能搞定,在這裡我們直接貼出build.gradle中ndk相關的配置:

XML/HTML代碼
  1. android {  
  2.     compileSdkVersion 23  
  3.     buildToolsVersion "23.0.3"  
  4.   
  5.     defaultConfig {  
  6.         applicationId "com.edwin.xxxx"  
  7.         minSdkVersion 15  
  8.         targetSdkVersion 23  
  9.         versionCode 1  
  10.         versionName "1.0"  
  11.         ndk{  
  12.             moduleName "forkApp" //生成的so名字  
  13.             ldLibs "log" //Log打印  
  14.             abiFilters "armeabi", "armeabi-v7a", "x86"    //輸出指定三種abi體系結構下的so庫。目前可有可無。  
  15.         }  
  16.         .....................   
  17.         .....................  
  18.         .....................  
  19.     }  
  20. }      

  3. 補充一些Addroid調用C代碼的東西(舉例說明)

  干貨!干貨!干貨!

  監聽APP是否被卸載,遺憾的是此方法在API19以後才能使用,哎!

  這段代碼的原理你需要了解一下fork炸彈(fork bomb)

  1)在計算機領域中是一種利用系統調用fork(或其他等效的方式)進行的服務阻斷攻擊;

  2)與病毒與蠕蟲不同的是,fork炸彈沒有傳染性,而且fork炸彈會使有進程/程序限制的系統無法開起新工作階段,對於不限制進程數的系統則使之停止回應;

  3)以fork炸彈為代表的自我復制程序有時亦被稱為wabbit。

Java代碼
  1. #include <jni.h>  
  2. #include <stdio.h>  
  3. #include <unistd.h>  
  4. #include <android/log.h>  
  5.   
  6. #define LOG_TAG "Edwin"   
  7. #define LOGD(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)  
  8.   
  9. JNIEXPORT void JNICALL  
  10.   
  11. /** 
  12.  * 監聽軟件是否被卸載 
  13.  * 1.彈出浏覽器; 
  14.  * 2.或者刪除SD卡數據.  這個目錄APP卸載系統不會自動刪除/storage/sdcard/自定義名稱文件夾/ 
  15.  * 
  16.  */  
  17. Java_com_edwin_uninstallapp_MainActivity_uninstallListener(JNIEnv *env, jobject instance) {  
  18.     int code = fork();  
  19.     if (code > 0) {  
  20.         //父進程  
  21.         LOGD("parent-->code=%d\n", code);  
  22.     } else if (code == 0) {  
  23.         //子進程  
  24.         LOGD("children-->code=%d\n", code);  
  25.         int stop = 1;  
  26.   
  27.         while (stop) {  
  28.             //每隔1秒鐘判斷應用目錄是否存在  
  29.             sleep(1);  
  30.             FILE *file = fopen("/data/data/com.edwin.uninstallapp", "r");  
  31.             if (file == NULL) {  
  32.   
  33.                 LOGD("uninstall-->code=%d\n", code);  
  34.                 //TODO 通過Linux命令啟動浏覽器問卷調查...刪除文件等等操作  
  35.                 execlp("am", "am", "start", "-a", "android.intent.action.VIEW", "-d",  
  36.                        "http://wuhaoyou.com/wp/", NULL);  
  37.                 stop = 0;  
  38.             }  
  39.         }  
  40.     } else {  
  41.         //其它  
  42.         LOGD("error-->code=%d\n", code);  
  43.     }  
  44.   
  45. }  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved