简单介绍下Android NDK环境的搭建,最好已经配置了科学上网,这样使用Android Studio的自动更新比较方便。
配置NDK
使用Android Studio下载NDK,也可以使用的SDK Manager 进行下载,并配置环境变量
检测环境变量
ndk-which gcc
配置成功时
配置Gradle
gradle插件不支持NDK(当然用它也可以进行NDK开发,就是非常不方便),我们需要使用gradle-experimental插件。gradle-experimental插件使用的时候与gradle插件稍微有点区别。
Project Gradle 配置如下
改变Gradle版本
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.7.0'
}
Module Gradle 配置
完整配置
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
defaultConfig {
applicationId "com.example.yangtianrui.ndktest"
minSdkVersion.apiLevel 15
targetSdkVersion.apiLevel 23
versionCode 4
versionName "1.0.1"
}
}
android.ndk {
moduleName "yangtr"
ldLibs.addAll(['log'])
cppFlags.add("-std=c++11")
cppFlags.add("-fexceptions")
platformVersion 15
stl 'gnustl_shared'
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file("proguard-rules.txt"))
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.1'
}
注意
首先在apply的时候我们引入的插件名称由’com.android.application’变成了’com.android.model.application’。
其次,在原来android的外层加入了一个model层次。
再次,原来在android的里面的块,除了defaultConfig外,全部移除android块放入model块中与android并列,并且前面的名字加上android.。
然后,compileSdkVersion 23与 buildToolsVersion “23.0.2”改成 compileSdkVersion = 23和buildToolsVersion = “23.0.2”,中间加上了=。
其次,添加上android.ndk块,块中的moduleName表示C/C++代码打包成so文件的名字。
再次,android.buildTypes块中的proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’改成proguardFiles.add(file(“proguard-rules.txt”))。
最后,注意dependencies块依然在最外层,它不在model块中。
Java 调用
public class MainActivity extends AppCompatActivity {
private TextView mTvText;
static {
System.loadLibrary("yangtr");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTvText = (TextView) findViewById(R.id.id_tv_text);
mTvText.setText(getString());
}
// 此处为JNI 的方法
// 使用Alt + Enter自动创建JNI文件
public native String getString();
}
C 文件的创建
使用这个插件后,C文件都是自动生成的
#include <jni.h>
JNIEXPORT jstring JNICALL
Java_com_example_yangtianrui_ndktest_MainActivity_getString(JNIEnv *env, jobject instance) {
return (*env)->NewStringUTF(env, "hello JNI");
}
执行效果
参照SegmentFault整理
https://segmentfault.com/a/1190000005152343