概述
通過本篇教程曲初,您將學(xué)習(xí)如何使用 Android Studio 輕松啟動 Android NDK 項目開發(fā)。
開發(fā)環(huán)境
- Android Studio 2.2 或以上的版本
- Android NDK 11c+ 或以上的版本
- Android SDK 最新版,這個一般會包含在 Android Studio 中兴溜。
- Android 5.0+ 測試機(jī)或模擬器
創(chuàng)建一個 HelloJni 項目
- 創(chuàng)建完成如下
- 配置 Studio 下載安裝 NDK喻喳,如果你之前已經(jīng)單獨(dú)下載過 NDK 也可以在 Project Structure -- SDK Location -- Android NDK location 下去引用校仑,我更推薦如下方式通過 Android SDK Manager 自動安裝,它會將 NDK 放入
/android-sdk/ndk-bundle/
下
- 運(yùn)行項目
將JNI構(gòu)建功能添加到HelloJni項目中
Android Studio 通過 Google 開發(fā)的 experimental plugin
支持 native 開發(fā)袱贮,通過這個插件我們可以不用考慮配置麻煩的 Android.mk 等構(gòu)建文件就可以進(jìn)行開發(fā)仿便,我們來將其添加到我們的項目中。
下面是 experimental 插件與 gradle 的版本對應(yīng)表攒巍,詳細(xì)查看官方文檔嗽仪,本教程我們將以 experimental plugin 0.7.3 為例
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 |
0.7.0 | 2.10 |
0.7.3 | 2.14.1 |
- 對應(yīng)的我們先配置項目的 gradle 版本為 gradle2.14.1,下載相應(yīng)版本 gradle 并配置
- 引用對應(yīng)版本的 experimental 插件柒莉,此處以 0.7.3 版本為例闻坚,打開項目的 build.gradle
替換
classpath 'com.android.tools.build:gradle:2.2.0'
為
classpath 'com.android.tools.build:gradle-experimental:0.7.3'
- 打開模塊 的 build.gradle 文件,修改讓它支持 experimental 插件的語法
替換
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.skyrin.hellojni"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
...
為
apply plugin: 'com.android.model.application' //<<<
model { //<<<
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.skyrin.hellojni"
minSdkVersion.apiLevel 15 //<<<
targetSdkVersion.apiLevel 25 //<<<
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles.add(file('proguard-android.txt')) //<<<
}
}
}
} //<<<
...
- 點(diǎn)擊 Sync Now 同步項目
現(xiàn)在可以添加 Jni 代碼了
- 配置模塊的 build.gradle 文件讓它可以創(chuàng)建 hello-jni 動態(tài)鏈接庫也就是 .os 等文件兢孝,然后 Sync 項目
buildTypes {
...
}
//添加
ndk{
moduleName "hello-jni"
}
- 在 MainActivity 中(當(dāng)然你也可以新建一個 JniUtils.class 進(jìn)行封裝)創(chuàng)建 native 方法
...
static {
System.loadLibrary("hello-jni");
}
public native String getStrFromJni();
...
- 點(diǎn)擊上面提示之后 Studio 會自動為我們創(chuàng)建 cpp 目錄以及 .c 文件窿凤,c 文件生成代碼如下
#include <jni.h>
JNIEXPORT jstring JNICALL
Java_com_skyrin_hellojni_MainActivity_getStrFromJni(JNIEnv *env, jobject instance) {
// TODO
return (*env)->NewStringUTF(env, returnValue);
}
替換其返回值如下
return (*env)->NewStringUTF(env, "Hello Jni!");
- 調(diào)用 native 函數(shù)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//調(diào)用jni代碼
((TextView)findViewById(R.id.tv_jni)).setText(getStrFromJni());
}
static {
System.loadLibrary("hello-jni");
}
public native String getStrFromJni();
}
- 我們來 Run 一下
- 用 c 寫個加法函數(shù)試試
java
public native int add(int a,int b);
Jni
JNIEXPORT jint JNICALL
Java_com_skyrin_hellojni_MainActivity_add(JNIEnv *env, jobject instance, jint a, jint b) {
// TODO
return a+b;
}
調(diào)用
((TextView)findViewById(R.id.tv_jni)).setText(add(2,3)+"");
- Run 一下