前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android Studio 快速启动 Android NDK 项目开发

Android Studio 快速启动 Android NDK 项目开发

作者头像
SkyRiN
发布2018-11-20 16:52:27
1.1K0
发布2018-11-20 16:52:27
举报
文章被收录于专栏:Coding+Coding+

概述

通过本篇教程,您将学习如何使用 Android Studio 轻松启动 Android NDK 项目开发。

开发环境

  • Android Studio 2.2 或以上的版本
  • Android NDK 11c+ 或以上的版本
  • Android SDK 最新版,这个一般会包含在 Android Studio 中。
  • Android 5.0+ 测试机或模拟器

创建一个 HelloJni 项目

  • 创建完成如下
  • 配置 Studio 下载安装 NDK,如果你之前已经单独下载过 NDK 也可以在 Project Structure -- SDK Location -- Android NDK location 下去引用,我更推荐如下方式通过 Android SDK Manager 自动安装,它会将 NDK 放入 /android-sdk/ndk-bundle/
  • 运行项目

将JNI构建功能添加到HelloJni项目中

Android Studio 通过 Google 开发的 experimental plugin 支持 native 开发,通过这个插件我们可以不用考虑配置麻烦的 Android.mk 等构建文件就可以进行开发,我们来将其添加到我们的项目中。 下面是 experimental 插件与 gradle 的版本对应表,详细查看官方文档,本教程我们将以 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

  • 对应的我们先配置项目的 gradle 版本为 gradle2.14.1,下载相应版本 gradle 并配置
  • 引用对应版本的 experimental 插件,此处以 0.7.3 版本为例,打开项目的 build.gradle

替换

代码语言:javascript
复制
classpath 'com.android.tools.build:gradle:2.2.0'

代码语言:javascript
复制
classpath 'com.android.tools.build:gradle-experimental:0.7.3'
  • 打开模块 的 build.gradle 文件,修改让它支持 experimental 插件的语法

替换

代码语言:javascript
复制
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'
        }
    }
}
...

代码语言:javascript
复制
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'))  //<<<
            }
        }
    }
}  //<<<
...
  • 点击 Sync Now 同步项目

现在可以添加 Jni 代码了

  • 配置模块的 build.gradle 文件让它可以创建 hello-jni 动态链接库也就是 .os 等文件,然后 Sync 项目
代码语言:javascript
复制
        buildTypes {
            ...
        }
        //添加
        ndk{
            moduleName "hello-jni"
        }
  • 在 MainActivity 中(当然你也可以新建一个 JniUtils.class 进行封装)创建 native 方法
代码语言:javascript
复制
    ...
    static {
        System.loadLibrary("hello-jni");
    }

    public native String getStrFromJni();
    ...
  • 点击上面提示之后 Studio 会自动为我们创建 cpp 目录以及 .c 文件,c 文件生成代码如下
代码语言:javascript
复制
#include <jni.h>

JNIEXPORT jstring JNICALL
Java_com_skyrin_hellojni_MainActivity_getStrFromJni(JNIEnv *env, jobject instance) {

    // TODO


    return (*env)->NewStringUTF(env, returnValue);
}

替换其返回值如下

代码语言:javascript
复制
return (*env)->NewStringUTF(env, "Hello Jni!");
  • 调用 native 函数
代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //调用jni代码
        ((TextView)findViewById(R.id.tv_jni)).setText(getStrFromJni());
    }

    static {
        System.loadLibrary("hello-jni");
    }

    public native String getStrFromJni();
}
  • 我们来 Run 一下
  • 用 c 写个加法函数试试

java

代码语言:javascript
复制
public native int add(int a,int b);

Jni

代码语言:javascript
复制
JNIEXPORT jint JNICALL
Java_com_skyrin_hellojni_MainActivity_add(JNIEnv *env, jobject instance, jint a, jint b) {

    // TODO
    return a+b;
}

调用

代码语言:javascript
复制
((TextView)findViewById(R.id.tv_jni)).setText(add(2,3)+"");
  • Run 一下

Congratulations! 你学会用 NDK 开发了✧。٩(㉨)و✧*。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.04.30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 创建一个 HelloJni 项目
  • 将JNI构建功能添加到HelloJni项目中
  • 现在可以添加 Jni 代码了
  • Congratulations! 你学会用 NDK 开发了✧。٩(㉨)و✧*。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档