- 新建一个普通的AndroidStudio工程
修改Project下的build.gradle :
用:classpath ‘com.android.tools.build:gradle-experimental:0.9.1’
替换原来的:classpath ‘com.android.tools.build:gradle:2.3.0’
代码如下:
buildscript {
repositories {
jcenter()
}
dependencies {
// classpath 'com.android.tools.build:gradle:2.3.0'
classpath 'com.android.tools.build:gradle-experimental:0.9.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
3.修改app下的build.gradle
用apply plugin:’com.android.model.application’
替换原来的apply plugin: ‘com.android.application’
再原来的Android外面添加model
再Android内部添加ndk{}
model{
Android{
ndk{
}
}
}
minSdkVersion 19->minSdkVersion.apiLevel 19或者minSdkVersion =“19”
targetSdkVersion 25->targetSdkVersion.apiLevel 25 或者 targetSdkVersion =“25”
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’->
proguardFiles.add(file(‘proguard-android.txt’))//混淆
//apply plugin: 'com.android.application'
apply plugin:'com.android.model.application'
model{
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.phone.zhimeng.phone"
minSdkVersion.apiLevel 19// minSdkVersion 19
targetSdkVersion.apiLevel 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
//proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆器
proguardFiles.add(file('proguard-android.txt'))
}
}
ndk{
moduleName"phoneModel"//so库的名字
toolchain = 'clang' //工具链
CFlags.add('-std=c99')
// 添加依赖库
ldLibs.addAll(['android','OpenSLES', 'log'])
// 生成不同abi体系的so库
// abiFilters.addAll(['armeabi','armeabi-v7a','arm64-v8a','x86','x86_64'])
abiFilters.addAll(['armeabi', 'armeabi-v7a', 'arm64-v8a',
'x86', 'x86_64',
'mips', 'mips64'])
}
}
}
4.再gradle.properties中添加:
# android.useDeprecatedNdk=true
5添加项目的ndk路径,
file->projectStructure->sdk location 配置ndk路径,配置完成后查看local.properties中是否有ndk路径
6.gradel 最好使用3.3以上的
distributionUrl=https://services.gradle.org/distributions/gradle-3.3-all.zip
7.新建java类编写native方法
public class testJni {
static {
System.loadLibrary("phoneModel");
}
public native String getStingFromC();
}
8.javah命令生成生成头文件:
下面是我在Terminal中生成头文件的方法:
首先定位到main目录下:
-d jni :生成的头文件放到该main下面的jni目录里
-classpath ./java 到该目录下去找 com.phone.zhimeng.phone.JNIUtil
D:\workSpace\Phone>cd app/src/main
D:\workSpace\Phone\app\src\main>javah -d jni -classpath ./java com.phone.zhimeng.phone.JNIUtil
D:\workSpace\Phone\app\src\main>
生成的.so动态库所在的目录D:\workSpace\Phone\app\build\intermediates\binaries\debug\lib
刚开始我一直到不到我的动态库位置,以为自己搞错了,找了半天才发现在这里
经过以上步骤,我们基本上完成了ndk开发的准备工作,下面可以开始撸代码了,
还有一点需要注意:
native生成c方法需要添加依赖库
我们在gradle中添加
compile 'com.android.tools.build:gradle-experimental:0.7.0'
但是Sync now 会报错,我们直接把这行代码注释掉,这样可以直接在native方法上
Alter+Enter 快捷键生成c代码,我们每次重启as的时候,都需要把这行代码编译一次,然后注释,就可以放心使用快捷键了