欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解如何使用Android Studio 進(jìn)行NDK開(kāi)發(fā)和調(diào)試

 更新時(shí)間:2017年12月06日 11:07:26   作者:ConnorLin  
本篇文章主要介紹了詳解如何使用Android Studio 進(jìn)行NDK開(kāi)發(fā)和調(diào)試,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

盡管Android Studio已經(jīng)越來(lái)越流行了,但很多人還是習(xí)慣于Eclipse或源碼環(huán)境下開(kāi)發(fā)JNI應(yīng)用。個(gè)人認(rèn)為使用Android Studio作NDK開(kāi)發(fā)是必然趨勢(shì),所以本文將簡(jiǎn)單介紹如何在Android Studio上實(shí)現(xiàn)NDK開(kāi)發(fā)。

簡(jiǎn)介

JNI

JNI 是Java Native Inteface的縮寫(xiě),是Java中定義的一種用于連接Java和C/C++接口的一種實(shí)現(xiàn)方式。

NDK

NDK 是 Native Developmentit的縮寫(xiě),是Google在Android開(kāi)發(fā)中提供的一套用于快速創(chuàng)建native工程的一個(gè)工具。
使用這個(gè)工具可以很方便的編寫(xiě)和調(diào)試JNI的代碼。

NDK可從官網(wǎng)或jb51.net下載。

Gradle

Gradle 是一個(gè)基于Apache Ant和Apache Maven概念的項(xiàng)目自動(dòng)化建構(gòu)工具。它使用一種基于Groovy的特定領(lǐng)域語(yǔ)言(DSL)來(lái)聲明項(xiàng)目設(shè)置。

以往Android NDK開(kāi)發(fā)需要在Eclipse或源碼環(huán)境下,建立并配置Android.mk和Application.mk,且還要通過(guò)java命令生成.h頭文件,才能編譯生成so庫(kù)。但在Android Studio中這些步驟都不需要,因?yàn)镚radle足夠強(qiáng)大,只需配置Gradle即可編譯生成so庫(kù)。

gradle-experimental插件

在2015年5月的Google I/O大會(huì)上, Google宣布Android Studio開(kāi)始支持NDK開(kāi)發(fā),通過(guò)和JetBrains的合作,將Clion整合進(jìn)了Android Studio 1.3,并免費(fèi)支持NDK C++開(kāi)發(fā)。

同年7月,在Android Studio 1.3版本上添加了gradle-experimental插件,該插件支持NDK開(kāi)發(fā)和調(diào)試,且?guī)в写a不全和重構(gòu)等高級(jí)功能。

CAVEAT: Note that this plugin is a preview of the plugin for feedback on performance and NDK integration. The Gradle API for the new component model is not final, which means each plugin will only work with a specific version of Gradle.
Additionally, the DSL may also change.
目前這個(gè)插件是預(yù)覽插件,并不是正式的。意味著插件只能運(yùn)行在特定的Gradle版本上。并且DSL(領(lǐng)域特定語(yǔ)言)也要改變。

使用Experimental插件進(jìn)行NDK開(kāi)發(fā)

使用Experimental插件的必要條件

1、Gradle-2.5或更高版本
2、Android Studio 1.3 RC1或更高版本
3、Android NDK r10e 或更高版本
4、Build Tools 19.0.0 或更高版本

每個(gè)版本的experimental插件需要特定的Gradle版本

Plugin Version Gradle Version
0.1.0 2.5
0.2.0 2.5
0.3.0-alpha3 2.6
0.4.0 2.8
0.6.0-alpha1 2.8
0.6.0-alpha5 2.10
0.7.0-alpha1 2.10

NDK開(kāi)發(fā)步驟

1、新建一個(gè)Android標(biāo)準(zhǔn)工程

2、按F4打開(kāi)工程配置

3、使用experimental插件需要對(duì)以下三個(gè)文件做修改:

./build.gradle
./app/build.gradle
./gradle/wrapper/gradle-wrapper.properties

./gradle/wrapper/gradle-wrapper.properties

將distributionUrl改用gradle-2.10版本

復(fù)制代碼 代碼如下:

distributionUrl=https\\://services.gradle.org/distributions/gradle-2.10-all.zip

./build.gradle

使用com.android.tools.build:gradle-experimental代替 com.android.tools.build:gradle

  buildscript {
    repositories {
      jcenter()
    }
    dependencies {
      //classpath 'com.android.tools.build:gradle:2.0.0'
      classpath "com.android.tools.build:gradle-experimental:0.7.0-alpha4"

      // NOTE: Do not place your application dependencies here; they belong
      // in the individual module build.gradle files
    }
  }

./app/build.gradle

這部分改動(dòng)比較大,修改及注釋如下:

  // 用com.android.model.application 代替 com.android.application
  apply plugin: 'com.android.model.application'
  // 將原來(lái)的配置用 model{}包起來(lái)
  model {
    android {
      // 取值必須使用 “=” 形式
      // 否則會(huì)報(bào) “Error:Cause: org.gradle.api.internal.ExtensibleDynamicObject” 錯(cuò)誤
      compileSdkVersion = 23
      buildToolsVersion = '23.0.2'
      defaultConfig {
        // 取值必須使用 “=” 形式
        applicationId = "com.connorlin.jnitest"
        //這里要注意是 xxSdkVersion.apiLevel
        // 否則會(huì)報(bào) “Unable to load class com.android.build.gradle.managed.ProductFlavor_Impl”錯(cuò)誤
        minSdkVersion.apiLevel = 15 
        targetSdkVersion.apiLevel = 23
        versionCode = 1
        versionName = "1.0"
      }
      // 配置NDK
      ndk {
        // 生成so的名字,是必須的
        moduleName ="JNITest"
        toolchain = 'clang'
        CFlags.add('-std=c99')
        // 添加依賴庫(kù)
        ldLibs.addAll(['android','OpenSLES', 'log'])
        // 生成不同abi體系的so庫(kù)
        abiFilters.addAll(['armeabi', 'armeabi-v7a', 'arm64-v8a',
                  'x86', 'x86_64',
                  'mips', 'mips64'])
      }
      buildTypes {
        release {
          minifyEnabled = false
          // 這里注意:使用proguardFiles.add()方法
          proguardFiles.add(file('proguard-rules.txt'))
        }
      }
    }
  }

4、在Java文件(這里以JNIActivity為例)中添加代碼

  static {
    System.loadLibrary("JNITest");
  }
  public native String testJni();

此時(shí),native方法標(biāo)紅,提示如下:

在testJni()方法上按快捷鍵Alt + Enter,出現(xiàn)如下提示

按回車(chē),會(huì)自動(dòng)在main目錄下生成jni文件夾,內(nèi)含JniDemo.c:

  #include <jni.h>
  JNIEXPORT jstring JNICALL
  Java_com_connorlin_jnitest_MainActivity_testJni(JNIEnv *env, jobject instance) {
    // TODO
    return (*env)->NewStringUTF(env, "returnValue");
  }

你會(huì)發(fā)現(xiàn),Android Studio已經(jīng)為我們自動(dòng)生成JNI方法了,你只需要再寫(xiě)實(shí)現(xiàn)就可以了。

至此,最簡(jiǎn)單的NDK開(kāi)發(fā)配置完畢。

其他配置,請(qǐng)參考官方文檔,Demo可以參考官方Demo

換種方式進(jìn)行NDK開(kāi)發(fā)

既然預(yù)覽版com.android.tools.build:gradle-experimental支持NDK,

那么正式版com.android.tools.build:gradle 是否也可以實(shí)現(xiàn)NDK開(kāi)發(fā)呢?

經(jīng)過(guò)實(shí)驗(yàn),答案是可以的!

步驟

1、新建一個(gè)Android標(biāo)準(zhǔn)工程,并在工程設(shè)置中配置NDK路徑。

2、打開(kāi) app level 的 build.gradle, 配置NDK

  ndk {
    moduleName "NdkJniDemo"     //生成的so名字
    abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種abi體系結(jié)構(gòu)下的so庫(kù),可忽略
  }

然后點(diǎn)擊右上角Sync Now, 會(huì)有如下錯(cuò)誤提示:

按提示,在 gradl.properties 文件里加上android.useDeprecatedNdk=true即可。

3、在Java文件(這里以JNIActivity為例)中添加代碼

  static {
    System.loadLibrary("JNITest");
  }
  public native String testJni();

接著在testJni()方法上按快捷鍵Alt + Enter并回車(chē),

同樣,會(huì)自動(dòng)在main目錄下生成jni文件夾,內(nèi)含JniDemo.c:

#include <jni.h>

但是,你會(huì)發(fā)現(xiàn)并不會(huì)自動(dòng)生成JNI方法,這是因?yàn)槭褂胑xperimental插件才會(huì)自動(dòng)生成代碼。

那自動(dòng)生成代碼該如何實(shí)現(xiàn)呢?

方法依然是使用gradle-experimental插件,但是不同的是,在app level的build.gradle中添加com.android.tools.build:gradle-experimental依賴。

4、在./app/build.gradle中添加gradle-experimental依賴

  dependencies {
    compile 'com.android.tools.build:gradle-experimental:0.7.0'
  }

再次在testJni()方法上按快捷鍵Alt + Enter并回車(chē)

  #include <jni.h>
  JNIEXPORT jstring JNICALL
  Java_com_connorlin_jnitest_MainActivity_testJni(JNIEnv *env, jobject instance) {
    // TODO
    return (*env)->NewStringUTF(env, "returnValue");
  }

你會(huì)發(fā)現(xiàn)成功自動(dòng)生成JNI方法了。

副作用

這種方式有個(gè)副作用是 Run app 時(shí)可能會(huì)報(bào)錯(cuò):

此時(shí),只要將gradle-experimental依賴注釋掉即可正常運(yùn)行,同時(shí)會(huì)保持自動(dòng)生成代碼的功能,直到關(guān)閉工程。

這樣我們?cè)谛枰詣?dòng)生成代碼的時(shí)候,將gradle-experimental依賴再次打開(kāi)即可。

NDK調(diào)試

默認(rèn)情況下是不支持NDK調(diào)試的,但要支持NDK調(diào)試也很簡(jiǎn)單,只要做些簡(jiǎn)單配置即可。

1、打開(kāi)JNI調(diào)試

2、配置Android Native - Debugger

3、下載LLDB 2.0

首次底部會(huì)報(bào)錯(cuò)

點(diǎn)擊 Fix,提示下載LLDB 2.0,照做,下載安裝即可。

4、完成NDK調(diào)試配置,可以正常調(diào)試了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論