使用的是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中增加配置:
参数内容:
Program:C:\Program Files\Java\jdk1.8.0_25\bin\javah.exe
Parameters:-v -jni -d $ModuleFileDir$\src\main\jni $FileClass$
Working directory:$SourcepathEntry$
设置结果
- 设置ndk-build的extend tool
Program:C:\ndk\ndk-build.cmd
Parameters:NDK_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$
最终结果:
疑惑:
- 我不相信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