从Android Studio 1.3 Beta1开始,就支持了NDK,我目前使用的版本是1.5.首先强调几点。

1.必须安装NDK并配置好环境变量(和配置JDK环境变量如出一辙:新建NDK_HOME我的变量值为D:\android-sdk-windows\ndk-bundle

在Path变量最后加上;%NDK_HOME%)

2.目前的NDK只支持gradle2.5,版本高了或低了都不行(后面还会说到)

接下来我通过实际建立一个工程赖演示NDK在Android Studio中的用法。我会一步一步的来,方便大家学习。

我们首先向平时一样建立一个空的项目模板,修改设置,设置Gradle版本为2.5

接下来我们需要将根目录下的gradle修改为实验性的gradle如下所示:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.2.0' // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
} allprojects {
repositories {
jcenter()
}
} task clean(type: Delete) {
delete rootProject.buildDir
}

因为需要gradle2.5的支持,我们需要需要将gradle/gradle-wrapper.properties中的版本修改为2.5,如下所示:

#Wed Oct 21 11:34:03 PDT 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zip

然后到了最容易出错的地方:修改原来的app/build.gradle,如下所示:

apply plugin: 'com.android.model.application'//这里加上.model
//在android{......}外面加上一层model{},
// 将android{......}中的buildTypes移动到android{}外面,但在model{}里面。
//对buildTypes做一些修改
//在android{}里面添加一个task.withType(JavaCompile){......}
//在model{}里面添加一个android.ndk{......}
//删除dependencies{......}中的testCompile 'junit:junit:4.12'
//最后要注意等于号要一一对应,不要漏写
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.3" defaultConfig.with {
applicationId = "com.ndkexample"
minSdkVersion.apiLevel = 14
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
}
task.withType(JavaCompile) {
//指定编译JDK版本
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
}
}
android.ndk {
moduleName = "ndkexample"//这个是将来生成的so文件的名称,可任意取
ldLibs += "log"//引入打印日志信息的包
//支持armeabi,armeabi-v7a,x86三个平台
abiFilters += "armeabi"
abiFilters += "armeabi-v7a"
abiFilters += "x86"
}
android.buildTypes {
release {
minifyEnabled false
proguardFiles += file('proguard-rules.pro')
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
/*testCompile 'junit:junit:4.12'*///这一行删去
compile 'com.android.support:appcompat-v7:23.4.0'
}

此处可以编译一下,看看是否出错,如果出错请仔细核对是否字符错误或包名没有改成你自己的。

据Google官网上说在官网上说,因为NDK还是实验版,不得已才让用户自己改代码,他们会逐渐让这些东西自动化。

在app/src/main文件夹上点右键,在弹出菜单中选择“New”、“Folder”、“JNI Folder”,按提示进行。

有一个“Change Folder Location”选项,不需要勾选,因为jni文件夹采用默认的位置(在main文件夹中)就行。然后main目录下会出现jni文件夹。


新建一个MyExample的类(与MainActivity在同一目录下),加载jni库,声明native方法


package com.ndkexample;

public class MyExample {
static {
System.loadLibrary("ndkexample");
}
public native void myLog();//打印日志信息的函数
}

此时你的myLog方法还是红色的,在上面按alt+enter生成c层的方法。

添加一个打印日志的方法_android_log_write(......);
#include <jni.h>
#include "android/log.h"
JNIEXPORT void JNICALL
Java_com_ndkexample_MyExample_myLog(JNIEnv *env, jobject instance) {
// TODO
__android_log_write(ANDROID_LOG_ERROR,"MainActivity","This is my first ndkexample!"); }

尤其不要忘记引入头文件log.h

之后clean project会在jni目录生成对应的头文件

然后在java层进行调用


package com.ndkexample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyExample myExample=new MyExample();
myExample.myLog();
}
}

编译运行可以看到日志信息被打印出来

06-22 20:36:25.984 31550-31550/? I/art: Late-enabling -Xcheck:jni

06-22 20:36:26.029 31550-31558/? I/art: Debugger is no longer active

06-22 20:36:26.057 31550-31550/? I/HwCust: Constructor found for class android.app.HwCustHwWallpaperManagerImpl

06-22 20:36:26.104 31550-31550/? I/HwCust: Constructor found for class android.widget.HwCustTextViewImpl

06-22 20:36:26.109 31550-31550/? I/HwCust: Constructor found for class android.widget.HwCustTextViewImpl

06-22 20:36:26.114 31550-31550/? E/MainActivity: This is my first ndkexample!

06-22 20:36:26.175 31550-31630/? I/OpenGLRenderer: Initialized EGL, version 1.4


至此成功。
如果遇到问题无法解决可以咨询我的QQ:1925554595

Android Studio NDK开发入门的更多相关文章

  1. android studio ndk 开发入门

    ndk 开发没什么神秘的ndk 说白了就是一个交叉编译的工具链,用它来生成各个CPU架构下的静态或动态链接库,linux 下就是 .a 和 .so 文件.原理就是 java 通过 JNI 和 C.C+ ...

  2. Android Studio JNI开发入门教程

    Android Studio JNI开发入门教程 2016-08-29 14:38 3269人阅读 评论(0) 收藏 举报  分类: JNI(3)    目录(?)[+]   概述 在Andorid ...

  3. 【Android】Android Studio NDK 开发

    Android Studio NDK 开发 记录在Android Studio中NDK简单开发的步骤 用到的Android Studio版本为3.5. 配置NDK 下载NDK 一般在SDK下已经有自带 ...

  4. (原)使用android studio ndk开发流程

    先使用android stuido创建一个app工程,创建工程的时候,.gradle目录结构下为2.8目录.(note:2.10目录为后续更新结果出现.) 依次修改上述红色方框标注部分内容: 1)修改 ...

  5. Android Studio NDK开发环境搭建

    一.   下载安装Android studio 和 NDK 二.   在Android studio中配置NDK(和SDK配置一样) 三.   用Android studio建立一个工程,打开proj ...

  6. Android Studio NDK开发-JNI调用Java方法

    相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等.... 如何在JNI中调用Java方法呢?就需 ...

  7. Android Studio NDK开发浅谈

    环境: Android Studio 1.1.0 NDK-r10d 1.新建项目--->包名:com.mxl.az.ndk 新建包含native方法的类:JniOperation.class p ...

  8. Android Studio && NDK开发

    Android Studio下载安装网址:http://www.android-studio.org/index.php/download/hisversion 在下载界面可以查看安装包内是否包含SD ...

  9. Android Studio NDK 开发 问题记录

    Android NDK 开发 问题解决 编译:找不到gles3库 使用旧的编译方式,写Android.mk 进行编译.报错如下 gles3/gl3.h no such file or director ...

随机推荐

  1. 关于jquery所有动画都有速度和动画的方向(在宽度方向上的动画)?

    不只是jquery的 animate 动画, 才有时间的 参数, 实际上, 在所有的动画中, 包括: show/hide/toggle, slideup/slidedown/slidetoggle, ...

  2. Goldbach`s Conjecture(素筛水题)题解

    Goldbach`s Conjecture Goldbach's conjecture is one of the oldest unsolved problems in number theory ...

  3. 51nod 1137 矩阵乘法

    基本的矩阵乘法 中间for(int j=0;i<n;i++)  //这里写错了   应该是j<n 晚上果然  效率不行 等会早点儿睡 //矩阵乘法 就是 两个矩阵 第一个矩阵的列 等与 第 ...

  4. 51Nod 1344 走格子(贪心

    1344 走格子   有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格子走出去.机器人有一个初始能量,每个格子对应一个整数A[i],表示这个格子的能量值.如果A[i ...

  5. JavaScript权威指南2.词法结构

    字符集 1.用16位的Unicode字符集编写的,可以表示地球上通用的每一种书面语言.国际化 2.每个字符都是用两个字节表示的 3.大小写敏感:关键字.变量.函数名.标识符:HTML并不区分大小写 H ...

  6. 【转载】TCP 与 UDP 的区别

    原文地址:TCP 与 UDP 的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信 ...

  7. Perl 获得当前路径

      1.有两种方法:1. use Cwd;my $dir = getcwd;#$dir中即为当前目录的完整路径信息.2. my $dir = $ENV{'PWD'};#ENV是一个散列,用于存放环境变 ...

  8. python正则表达式re模块详细介绍--转载

    本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这点不用担心,python会处理地和Ascii字符一样漂亮. 正则表达式使用反斜杆( ...

  9. Codeforces Round #323 (Div. 2) C. GCD Table map

    题目链接:http://codeforces.com/contest/583/problem/C C. GCD Table time limit per test 2 seconds memory l ...

  10. Linux环境下的定时任务(转载)

    今天做了个数据库的备份脚本,顺便系统得学习一下Linux下定时执行脚本的设置.Linux下的定时执行主要是使用crontab文件中加入定制计划来执行,设置比Windows稍微复杂一些(因为没有图形界面 ...