Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 使用AndroidStudio進行NDK開發簡單配置,androidstudiondk

使用AndroidStudio進行NDK開發簡單配置,androidstudiondk

編輯:關於android開發

使用AndroidStudio進行NDK開發簡單配置,androidstudiondk


1. 准備工作

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

下載好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. 項目配置

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

  • 創建Android.mk
    •   

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

      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      LOCAL_MODULE := hello_jni
      LOCAL_SRC_FILES := hello_jni.c
      include $(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相關的配置:

       

      android {
          compileSdkVersion 23
          buildToolsVersion "23.0.3"
      
          defaultConfig {
              applicationId "com.edwin.xxxx"
              minSdkVersion 15
              targetSdkVersion 23
              versionCode 1
              versionName "1.0"
              ndk{
                  moduleName "forkApp" //生成的so名字
                  ldLibs "log" //Log打印
                  abiFilters "armeabi", "armeabi-v7a", "x86"    //輸出指定三種abi體系結構下的so庫。目前可有可無。
              }
              ..................... 
              .....................
              .....................
          }
      }    

 

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

干貨!干貨!干貨!

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

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

 

#include <jni.h>
#include <stdio.h>
#include <unistd.h>
#include <android/log.h>

#define LOG_TAG "Edwin" 
#define LOGD(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

JNIEXPORT void JNICALL

/**
 * 監聽軟件是否被卸載
 * 1.彈出浏覽器;
 * 2.或者刪除SD卡數據.  這個目錄APP卸載系統不會自動刪除/storage/sdcard/自定義名稱文件夾/
 *
 */
Java_com_edwin_uninstallapp_MainActivity_uninstallListener(JNIEnv *env, jobject instance) {
    int code = fork();
    if (code > 0) {
        //父進程
        LOGD("parent-->code=%d\n", code);
    } else if (code == 0) {
        //子進程
        LOGD("children-->code=%d\n", code);
        int stop = 1;

        while (stop) {
            //每隔1秒鐘判斷應用目錄是否存在
            sleep(1);
            FILE *file = fopen("/data/data/com.edwin.uninstallapp", "r");
            if (file == NULL) {

                LOGD("uninstall-->code=%d\n", code);
                //TODO 通過Linux命令啟動浏覽器問卷調查...刪除文件等等操作
                execlp("am", "am", "start", "-a", "android.intent.action.VIEW", "-d",
                       "http://wuhaoyou.com/wp/", NULL);
                stop = 0;
            }
        }
    } else {
        //其它
        LOGD("error-->code=%d\n", code);
    }

}

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved