Android Studio进行NDK开发笔记

使用的是AS2.1.2版本

方案一

  • AS自带的有NDK插件,但是会出现Deprecated错误。解决方法:按提示操作即可。
  • AS的NDK插件不需要编写Application.mk和Android.mk,所以自己编写的无效!!,关键是那插件功能太弱了(很多Android.mk的属性不能修改)。如果想用自己的mk文件,需要在app/build.gradle中打掉NDK的所有配置。

    android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    defaultConfig {
        applicationId "ckm.xxx.testndk"
        minSdkVersion 19
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    // 如果要使用自己的Application.mk和Android.mk需要修改下面2处。
    // 修改1,直接打掉下面配置
    //        ndk{
    //            moduleName "test"
    //            abiFilters "armeabi","armeabi-v7a"
    //        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    //    sourceSets { main { jni.srcDirs = ['src/main/jni'] } }
    // 修改2,需要把jni.srcDirs设置为空。
    //    sourceSets {
    //        main {
    //            jni.srcDirs = []
    //        }
    //    }
    }
  • 自动生成头文件,在extend tool中增加配置:
    Android Studio进行NDK开发笔记_第1张图片
    参数内容:

Program:C:\Program Files\Java\jdk1.8.0_25\bin\javah.exe
Parameters:-v -jni -d $ModuleFileDir$\src\main\jni $FileClass$
Working directory:$SourcepathEntry$

设置结果
Android Studio进行NDK开发笔记_第2张图片
- 设置ndk-build的extend tool

ProgramC:\ndk\ndk-build.cmd
ParametersNDK_PROJECT_PATH=$ModuleFileDir$/build/intermediates/ndk NDK_LIBS_OUT=$ModuleFileDir$/src/main/jniLibs NDK_APPLICATION_MK=$ModuleFileDir$/src/main/jni/Application.mk APP_BUILD_SCRIPT=$ModuleFileDir$/src/main/jni/Android.mk V=1
Working directory:$SourcepathEntry$

最终结果:Android Studio进行NDK开发笔记_第3张图片

疑惑:

  • 我不相信AS不支持mk文件(只能当做文本文件识别),肯定有地方设置,还为找到设置地方。

注意:

如果按照上面的方式使用自定义Android.mk那么AS将无法识别到native函数。

方案二

来源:http://stackoverflow.com/questions/21096819/jni-and-gradle-in-android-studio

此方案主要是直接修改build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 14
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "com.example.application"
        minSdkVersion 14
        targetSdkVersion 14

        ndk {
            moduleName "YourModuleName"
        }
    }

    sourceSets.main {
        jni.srcDirs = [] // This prevents the auto generation of Android.mk
        jniLibs.srcDir 'src/main/libs' // This is not necessary unless you have precompiled libraries in your project.
    }

    task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
        def ndkDir = android.ndkDirectory
        commandLine "$ndkDir/ndk-build",
                '-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
                '-j', Runtime.runtime.availableProcessors(),
                'all',
                'NDK_DEBUG=1'
    }

    task cleanNative(type: Exec, description: 'Clean JNI object files') {
        def ndkDir = android.ndkDirectory
        commandLine "$ndkDir/ndk-build",
                '-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
                'clean'
    }

    clean.dependsOn 'cleanNative'

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn buildNative
    }
}

dependencies {
    compile 'com.android.support:support-v4:20.0.0'
}

参考:图片和extend tool设置都来自这位博主,非常感谢。

参考(请同事写了段代码处理下):

#!/bin/sh

for arg in "$@"
do
 if [[ $arg == NDK_PROJECT_PATH=* ]];then
  param1=`echo $arg | awk -F = '{printf $1}'`
 elif [[ $arg == APP_BUILD_SCRIPT=* ]];then
  param2=`echo $arg | awk -F = '{printf $2}'`
 else
  param="$param $arg"
 fi
done

#echo $param2
param2=`echo $param2 | sed 's#build/intermediates/ndk/debug/Android.mk#src/main#g'`
#echo $param2
#echo ""

if [[ -n "$param1" ]] && [[ -n "$param2" ]]
then
  param1="$param1=$param2"
  param="$param1 $param"
fi
DIR="$(cd "$(dirname "$0")" && pwd)"
$DIR/build/ndk-build $param

参考:AS,NDK,OpenCV

你可能感兴趣的:(Android Studio进行NDK开发笔记)