1. 程式人生 > >AndroidStudio使用NDK配置方法

AndroidStudio使用NDK配置方法

配置Gradle生成so

在AndroidStudio2.1及以前我是通過下面的方式配置NDK的,不知道是從哪個版本開始的,我第一次在AS上使用NDK的時候用的就是AndroidStudio2.1了。

首先在gradle.properties裡面新增 android.useDeprecatedNDK = true

android{}下的defaultconfig{}程式碼塊中新增ndk{}

ndk{
    moduleName = "xxx"
    //abiFilters("armeabi", "armeabi-v7a"..)
    //ldLibs = ["log"]
    //cFlags
//stl(ie:gnustl_shared,stlport_static..) }

預設在src/main/jni目錄下面找c/c++檔案編譯,也可以在android{}下新增sourceSet{}

sourceSet{
    main{
        jni.srcDirs=['src/main/cpp']
    }
}

就能將指定目錄下的c/c++檔案編譯成指定的模組名.so。

編譯多個模組

上面這種方式通過gradle無法編譯成多個模組,編譯多個模組還是要自己寫Android.mk檔案實現,通過手動執行ndk-build編譯成的*.so檔案預設在src/main/libs下面。

打包APK時,預設是尋找so的目錄是/build/intermediates/ndk和/build/intermediates/jniLibs,前者是使用原始碼由Gradle編譯成的so所處的位置,後者一般是一些第三方的so或者自己手動使用ndk編譯生成的so檔案所生成的,這個位置在src/main/jniLibs。

因此手動編譯好so檔案後,將其複製到jniLibs下面,或者在此放置第三方so,或者在build.gradle檔案裡面的android下面新增jniLib.srcDir定義了Gradle在哪裡尋找生成的so庫檔案

sourceSets{
  main{
    jniLib.srcDirs=['src/main/libs'
] // jniLib.srcDirs定義了Gradle在哪裡尋找生成的so庫檔案 } }

上面就是使用ndk-build通過自己定義Android.mk生成so的方式,但是分析apk檔案(build->Analyze APK)發現打包進去來了兩個so,下面libnative-lib.so是我在Android.mk中設定的模組名。上面這個其實是Gradle構建的,Gradle構建so的時候預設模組名字就是app,並且預設的編譯c/c++的路徑是src/main/jni,要修改這兩個預設設定就需要像上面配置Gradle構建so的方式修改。

use_ndk--build1.png

為了在我們自己構建so的時候禁用Gradle需要做的是配置jni.srcDirs設定成一個空的陣列,這樣就可以禁用通過Gradle來編譯本地c/c++程式碼。

sourceSets{
  main{
    jni.srcDirs=[]  // jni.srcDirs禁用通過Gradle來編譯本地c/c++程式碼
  }
}

再看apk結構,由Gradle構建的so就不見了。

use_ndk--build2.png

關聯Android.mk到Gradle

AndroidStudio2.2以後的另一種使用Android.mk的方式,可以不用ndk-build手動構建。

不需要手動使用ndk-build編譯,只需要將其關聯到Gradle上,Gradle 會將 ndk-build作為一個依賴執行,然後將so打包到 apk 中,編譯好的so在目錄/build/intermediates/ndkBuild下面。

滑鼠右鍵要連結的本地庫所在的模組,選擇Link C++ Project with Gradle,在彈出的對話方塊中選擇Build System為ndk-build,再指定Amdroid.mk的路徑點選ok即可

select_ndk.png

這樣就不用在命令列中手動執行ndk-build編譯了,Gradle就會自動的構建寫好的Android.mk。

上面的操作實際是也可以直接在該模組的build.gradle中的android下面新增

android {
  ...
  defaultConfig {...}
  buildTypes {...}
  // add manually
  externalNativeBuild {
    ndkBuild {
      path "Android.mk"
      // arguments "-DCMAKE_VERBOSE_MAKEFILE=TRUE"
      // Sets optional flags for the C compiler.
      // cFlags "-D_EXAMPLE_C_FLAG1", "-D_EXAMPLE_C_FLAG2"
      // Sets a flag to enable format macro constants for the C++ compiler.
      // cppFlags "-D__STDC_FORMAT_MACROS"
    }
  }
}

使用cmake

AndroidStudio2.2以後還推出了使用cmake指令碼來構建so,方式為在模組根目錄下建立CMakeLists.txt

# Sets the minimum version of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build.

cmake_minimum_required(VERSION 3.4.1)

# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.

add_library( # Specifies the name of the library.
             native-lib

            # Sets the library as a shared library.
             SHARED

            # Provides a relative path to your source file(s).
            src/main/jni/native-lib.c )

然後和上面關聯ndk-build指令碼的方式類似,在彈出的對話方塊中選擇Build System為cmake,再指定CMakeLists.txt的位置。這樣操作類似與直接在該模組的build.gradle中的android下面新增

android {
  ...
  defaultConfig {...}
  buildTypes {...}
  // add manually
  externalNativeBuild {
    cmake {
      path "CMakeLists.txt"
    }
  }
}

指令碼語法

CMake

相關推薦

springmvc和json整合配置方法

repl bin blank converter htm spring配置 tpm port 三方 配置方法一 1、導入第三方的jackson包,jackson-mapper-asl-1.9.7.jar和jackson-core-asl-1.9.7.jar。 2、spri

Linux操作系統下/etc/hosts文件配置方法

主機名 進行 問題 解釋 很快 中一 linux 同時 包括 1、關於/etc/host,主機名和IP配置文件   Hosts - The static table lookup for host name(主機名查詢靜態表)   hosts文件是Linux系統中一個負責

j2ee監聽器的實現及配置方法

tin sta j2ee bsp 對象 配置方法 clas http ont j2ee中存在的監聽器有八種,其中四種有關於session 可以分為以下幾類: 生命周期類:監聽對象的創建和銷毀 Interface  ServletRequestListener Interfa

phpunit 生成三種日誌文件的配置方法

complete spa php style highlight bin 方法 cnblogs nco #目錄結構 windows bin目錄下 ├── phpunit.phar ├── phpunit.cmd ├──

Python的Flask框架使用Redis做數據緩存的配置方法

num pre 設置 span run type con sudo python flask配置redis 首先得下載flask的緩存插件Flask-Cache,使用pip下載。 sudo pip install flask_cache 為應用擴展flask_ca

Windows訪問Linux下的共享目錄的配置方法

cat tab all samb dha server nbsp lan eno user安全級別 第一步:安裝samba3(如果已經安裝就跳過這一步) [[email protected]/* */ /]# yum groupinstall "CIFS

【STORAGE】Qlogic FC存儲交換機cmd配置方法

dmi bsp pos add rac .net edi csdn clu *************************************************************** ****原文: blog.csdn.net/clark_xu

Spring之AOP在XML中的配置方法

字段 object 代理 [] ger 編程 調用 加載器 bsp AOP 即 Aspect Oriental Program 面向切面編程 先來一個栗子: <aop:config> <aop:pointcut id="

PPP的兩種配置方法(pap和chap)

pap chapPAP的配置R1上的配置[R1]int s4/0/0[R1-Serial4/0/0]ppp authentication-mode pap[R1-Serial4/0/0]q[R1]aaa[R1-aaa]local-user huawei password cipher 123456Info:

mongodb切片配置方法

-s 查看 conf init collect 架構圖 切片 創建索引 () ---------------------------------切片架構圖------------------------------------------------------------

cmake安裝mysql及多實例配置方法

end transacti per 企業 erro mysql con 初始 root 一、安裝mysql 1、 生產環境如何選擇MySQL版本 1. 選擇社區版的穩定GA版本2. 可以選擇5.1或5.5.互聯網公司主流5.5, 其次是5.1和5.63. 選擇發布後6個月以

Spring-boot之jQuery File Upload後臺配置方法

文件上傳 query jquer highlight origin exc exist int alt 文件上傳在Spring-boot中本身配置起來非常簡單,但是有個多文件傳遞和單個傳遞的問題。 兩者配置是略有不同的,而且還有一些讓我這個技術小白很容易踩坑的地方。 重

mysql-5.7.13-winx64 免安裝版配置方法

comm 免密 install 免密碼登錄 命令 logs detail itl target 1.下載MySQL Community Server 5.7.13 解壓MySQL壓縮包 2.修改 my-default.ini skip-grant-

Spring+Quartz實現定時任務的配置方法

detail 包含 範例 empty beans ref tail 可選 creat 1、Scheduler的配置 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&g

Scribe安裝及配置方法

scribeScribe簡介Scribe是Facebook開源的分布式日誌收集系統,目前在各大互聯網公司內部已經得到大量的應用。它能夠從各種日誌源上收集日誌,存儲到一個中央存儲系統(可以是NFS,分布式文件系統等)上,以便於進行集中統計分析處理。它為日誌的“分布式收集,統一處理”提供了一個可擴展的,高容錯的方

BlockCanary在Android原生開發中的配置方法

static 簡單 分析 用戶 多少秒 arr all 方法 阻塞 BlockCanary對主線程操作進行了完全透明的監控,並能輸出有效的信息,幫助開發分析、定位到問題所在,迅速優化應用。 下面介紹配置方法。 1. 找到配置BlockCanary的jar包和arr包 blo

阿裏雲服務器 ECS 部署lamp:centos+apache+mysql+php安裝配置方法 (centos7)

ever linux 命令 port server sel kcon linu 開機 阿裏雲服務 阿裏雲服務器 ECS 部署lamp:centos+apache+mysql+php安裝配置方法 (centos7) 1.效果圖 1 2. 部署步驟 1 1. mysql安裝附加

hibernate框架在eclipse下的配置方法(一)

java、 sql數據庫 文件目錄 測試表 any 配置 包名 ive 當我 一、ORM O:object 對象 R:Realtion 關系(關系型數據庫) M:Mapping 映射 ORM:對象關系型映射   目前流行的編程語言,如Java、C# ,它們都是面向對象的編程

OpenStack中的rabbitmq的配置方法

server plugin style lis setting creating 開機 alt .cn OpenStack中的rabbitmq的配置方法 author:headsen chen 2017-10-11 17:24:58

mysql-5.7.19免安裝版的配置方法

show 找到 char conn window 文件 move 數據庫 剛才 1. 下載MySQL Community Server 5.6.13 2. 解壓MySQL壓縮包 將以下載的MySQL壓縮包解壓到自定義目錄下,我的解壓目錄是: "D:\