Android Studio 를 사용 하여 NDK 개발 과 디 버 깅 을 하 는 방법 에 대해 자세히 알 아 보기

9530 단어 AndroidStudioNDK
안 드 로 이 드 스튜디오 가 점점 유행 하고 있 음 에 도 불구 하고 많은 사람들 이 Eclipse 나 소스 환경 에서 JNI 애플 리 케 이 션 을 개발 하 는 데 익숙 하 다.개인 적 으로 안 드 로 이 드 스튜디오 를 NDK 개발 로 사용 하 는 것 은 필연 적 인 추세 라 고 생각 하기 때문에 본 고 는 안 드 로 이 드 스튜디오 에서 NDK 개발 을 어떻게 실현 하 는 지 간단하게 소개 한다.
간단 한 소개
JNI
JNI 는 자바 네 이 티 브 Inteface 의 줄 임 말로 자바 에서 정의 하 는 자바 와 C/C+인 터 페 이 스 를 연결 하 는 실현 방식 이다.
NDK
NDK 는 Native Development 의 줄 임 말로 Google 이 Android 개발 에서 제공 하 는 네 이 티 브 프로젝트 를 빠르게 만 드 는 데 사용 되 는 도구 입 니 다.
이 도 구 를 사용 하면 JNI 코드 를 편리 하 게 작성 하고 디 버 깅 할 수 있 습 니 다.
NDK 는 홈 페이지 나jb51.net에서 다운로드 할 수 있다.
Gradle
Gradle 은 Apache Ant 와 Apache Maven 개념 을 바탕 으로 하 는 프로젝트 자동화 구축 도구 이다.이 는 Groovy 기반 의 특정 영역 언어(DSL)를 사용 하여 프로젝트 설정 을 설명 합 니 다.
기 존 Android NDK 개발 은 Eclipse 나 소스 환경 에서 Android.mk 와 Application.mk 를 구축 하고 설정 하 며 자바 명령 을 통 해.h 헤더 파일 을 생 성 해 야 so 라 이브 러 리 를 컴 파일 할 수 있 습 니 다.그러나 Android Studio 에 서 는 이러한 절차 가 필요 하지 않 습 니 다.Gradle 이 충분 하기 때문에 Gradle 을 설정 하면 so 라 이브 러 리 를 컴 파일 할 수 있 습 니 다.
gradle-experimental 플러그 인
2015 년 5 월 구 글 I/O 총회 에서 구 글 은 안 드 로 이 드 스튜디오 가 NDK 개발 을 지원 하기 시작 했다 고 발 표 했 고,JetBrains 와 의 협업 을 통 해 클 리 온 을 안 드 로 이 드 스튜디오 1.3 에 통합 하고 NDK C++개발 을 무료 로 지원 했다.
같은 해 7 월 에는 NDK 개발 과 디 버 깅 을 지원 하고 코드 불완전 과 재 구성 등 고급 기능 을 갖 춘 Android Studio 1.3 버 전에 gradle-experimental 플러그 인 을 추가 했다.
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.
현재 이 플러그 인 은 미리 보기 플러그 인 이지 정식 플러그 인 이 아 닙 니 다.플러그 인 은 특정한 Gradle 버 전에 서 만 실 행 될 수 있 음 을 의미 합 니 다.그리고 DSL(영역 특정 언어)도 바 꿔 야 한다.
Experimental 플러그 인 을 사용 하여 NDK 개발
Experimental 플러그 인 사용 에 필요 한 조건
1.Gradle-2.5 또는 더 높 은 버 전
2.Android Studio 1.3 RC1 또는 더 높 은 버 전
3.Android NDK r10e 또는 더 높 은 버 전
4.Build Tools 19.0.0 이상 버 전
각 버 전의 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 개발 절차
1.안 드 로 이 드 표준 프로젝트 새로 만 들 기
2、F4 누 르 면 프로젝트 설정 열기

3.experimental 플러그 인 을 사용 하려 면 다음 세 개의 파일 을 수정 해 야 합 니 다.

./build.gradle
./app/build.gradle
./gradle/wrapper/gradle-wrapper.properties
./gradle/wrapper/gradle-wrapper.properties
distributionUrl 을 gradle-2.10 버 전 으로 변경 합 니 다.

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
이 부분의 변경 이 비교적 크 고 수정 과 주석 은 다음 과 같다.

  //  com.android.model.application    com.android.application
  apply plugin: 'com.android.model.application'
  //         model{}   
  model {
    android {
      //        “=”   
      //      “Error:Cause: org.gradle.api.internal.ExtensibleDynamicObject”   
      compileSdkVersion = 23
      buildToolsVersion = '23.0.2'
      defaultConfig {
        //        “=”   
        applicationId = "com.connorlin.jnitest"
        //       xxSdkVersion.apiLevel
        //      “Unable to load class com.android.build.gradle.managed.ProductFlavor_Impl”  
        minSdkVersion.apiLevel = 15 
        targetSdkVersion.apiLevel = 23
        versionCode = 1
        versionName = "1.0"
      }
      //   NDK
      ndk {
        //   so   ,    
        moduleName ="JNITest"
        toolchain = 'clang'
        CFlags.add('-std=c99')
        //      
        ldLibs.addAll(['android','OpenSLES', 'log'])
        //     abi   so 
        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.자바 파일(JNIActivity 예)에 코드 추가

  static {
    System.loadLibrary("JNITest");
  }
  public native String testJni();
이때 native 방법 은 빨간색 을 표시 합 니 다.힌트 는 다음 과 같 습 니 다.

testJni()방법 에서 단축 키 Alt+Enter 를 누 르 면 다음 과 같은 알림 이 나타 납 니 다.

Enter 키 를 누 르 면 자동 으로 main 디 렉 터 리 에서 jni 폴 더 를 생 성 합 니 다.JniDemo.c 가 포함 되 어 있 습 니 다.

  #include <jni.h>
  JNIEXPORT jstring JNICALL
  Java_com_connorlin_jnitest_MainActivity_testJni(JNIEnv *env, jobject instance) {
    // TODO
    return (*env)->NewStringUTF(env, "returnValue");
  }
당신 은 안 드 로 이 드 스튜디오 가 우리 에 게 자동 으로 JNI 방법 을 생 성 해 주 었 다 는 것 을 알 게 될 것 입 니 다.당신 은 다시 쓰기 만 하면 됩 니 다.
이로써 가장 간단 한 NDK 개발 배치 가 완료 됐다.
기타 설정,참고공식 문서,데모 참조공식 데모
다른 방식 으로 NDK 개발 을 진행 하 다
미리 보기 판 com.android.tools.build:gradle-experimental 은 NDK 를 지원 합 니 다.
그렇다면 정식 버 전 com.android.tools.build:gradle 도 NDK 개발 을 실현 할 수 있 을 까?
실험 을 통 해 답 은 가능 하 다!
순서
1.Android 표준 프로젝트 를 새로 만 들 고 프로젝트 설정 에 NDK 경 로 를 설정 합 니 다.
2.app level 의 build.gradle 을 열 고 NDK 설정

  ndk {
    moduleName "NdkJniDemo"     //   so  
    abiFilters "armeabi", "armeabi-v7a", "x86" //      abi      so ,   
  }
그리고 오른쪽 상단 Sync Now 를 누 르 면 다음 과 같은 오류 알림 이 있 습 니 다.

힌트 를 누 르 면 gradl.properties 파일 에 android.useDeprecatedNdk=true 를 추가 하면 됩 니 다.
3.자바 파일(JNIActivity 예)에 코드 추가

  static {
    System.loadLibrary("JNITest");
  }
  public native String testJni();
이 어 testJni()방법 에서 단축 키 Alt+Enter 를 누 르 고 차 로 돌아 갑 니 다.
마찬가지 로 main 디 렉 터 리 에서 jni 폴 더 를 자동 으로 생 성 합 니 다.JniDemo.c 가 포함 되 어 있 습 니 다.

#include <jni.h>
하지만 JNI 방법 이 자동 으로 생 성 되 지 않 는 다 는 것 을 알 게 될 것 입 니 다.이것 은 experimental 플러그 인 을 사용 해 야 코드 가 자동 으로 생 성 되 기 때 문 입 니 다.
그럼 자동 생 성 코드 는 어떻게 실현 해 야 합 니까?
방법 은 여전히 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 를 누 르 고 차 로 돌아 갑 니 다.

  #include <jni.h>
  JNIEXPORT jstring JNICALL
  Java_com_connorlin_jnitest_MainActivity_testJni(JNIEnv *env, jobject instance) {
    // TODO
    return (*env)->NewStringUTF(env, "returnValue");
  }
JNI 를 자동 으로 생 성 하 는 방법 을 발견 할 수 있 을 겁 니 다.
부작용
이런 방식 의 부작용 은 Run app 일 때 오류 가 발생 할 수 있 습 니 다.

이 때 gradle-experimental 을 주석 에 의존 하면 정상적으로 실행 되 며,동시에 프로젝트 를 닫 을 때 까지 코드 를 자동 으로 생 성 하 는 기능 을 유지 합 니 다.
이렇게 하면 우 리 는 자동 으로 코드 를 생 성 해 야 할 때 gradle-experimental 을 다시 열 면 됩 니 다.
NDK 디 버 깅
기본적으로 NDK 디 버 깅 은 지원 되 지 않 지만 NDK 디 버 깅 을 지원 하 는 것 도 간단 합 니 다.간단 한 설정 만 하면 됩 니 다.
1.JNI 디 버 깅 열기

2,안 드 로 이 드 네 이 티 브 설정-디 버 거


3.LLDB 2.0 다운로드
첫 번 째 바닥 이 틀 릴 수 있 습 니 다.

Fix 를 누 르 면 LLDB 2.0 을 다운로드 하고 그대로 하 며 다운로드 하여 설치 하면 됩 니 다.
4.NDK 디 버 깅 설정 을 완성 하면 정상적으로 디 버 깅 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기