点击右边,选择你解压的NDK,点击应用。这一步将工具包关联到android  studio。

在 local.properties 文件中设置ndk的路径:

就是你解压的NDK工具集的路径  我的是 E:\Android\android-ndk-r10,注意要对应加斜杠

到这里我说JNI(有时说的NDK开发,一样的,叫法不同)环境初步建好了,不想eclipse那样什么cygwin啊,怎么还要ndk-build的啊,我说什么都不用,就用一个命令就行了,下面就开始我们的第一个小demo。

程序过程讲解:

一:头文件生成:

第一步:像平时一样将一个空的android工程。

第二部:前面说了,要用native来标识一个方法,告诉程序这是一个本地方法。程序如下

public class NDK extends Activity{static {System.loadLibrary("MyJni");//导入生成的链接库文件
    }public native String getStringFromNative();//本地方法
    public native String getString_From_c();protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.myjni);System.out.println(getStringFromNative());}public void onClick(View view) {System.out.println(getString_From_c());Toast.makeText(this, getStringFromNative(), Toast.LENGTH_LONG).show();}}
 这一步可以先不加这行代码:SloadLibrary("MyJni";//导入生成的链接库文件 ,因为这里还没有建立C文件,不能生成库文件。
 然后make project一下,目的就是编译成对应的class文件。然后根据生成的class文件,利用javah生成对应的 .h头文件。如果没有编译就执行javah命令会提示找不到这个类文件的。下面是我的工程界面;

这里说一下:我工程里面的本地方法显示是红色,我一开始以为不能进行JNI开发,或者有错误,包括我后面的C文件和头文件里面也有很多地方是红色的,我开始定义这些方法的时候是红色的,但是有时又不是的,不知道是android studio对NDK支持不太好,还是怎么得,但是后面开发JNI程序没有任何影响的。所以就没有关了,如果那位大神知道还望告诉我一下,将非常感激。
第三部:打开命令窗口,点击view ->ToolsWindows->Terminal,如下图:

进来后默认是指向当前的工程目录,接下来输入命令:cd app\src\main 回车,切换到main目录下:如图:
至于怎么理解命令,建议你去学一下linux系统,这事linux最基本的操作。
第四步:输入javah -d jni -classpath E:\Android\sdk\platforms\android-22\android.jar;..\..\build\intermediates\classes\debug example.daosong.com.ndkdemo.NDK(注意前后有英文的;号隔开的哈)  生成头文件(要先编译程序的,不然会报错)。可能有些人看到这里就茫然了,这么长怎么写出来的哟,这怎么记得到的,我告诉大家根本不用记,我给你说怎么得来的,你们就能很快写出来了,是不是真的哟,不信试一试的。
首先:javah是生成头文件需要的工具,这个很好记得把,相信学java是都用过的。-d jni 在工程下生成jni目录,到时会在这个目录下建JNI开始的C/C++源文件的。
-classpath E:\Android\sdk\platforms\android-22\android.jar 这个就是你SDK文件下android.jar所在的文件位置,找到后复制即可。在学java的时候讲了这个的,可以将E:\Android\sdk\platforms\android-22\android.jar配置到环境变量就可以不写出来,因为在生成头文件是需要这个jar包,因为我没有配置到环境变量,所以这里就显示写出来。这部分很好搞定把。前面好弄,那后面部分怎了弄得,相信学过linux的很快能够知道的。
..\..\build\intermediates\classes\debug example.daosong.com.ndkdemo.NDK 
首先是 ..\..\build\intermediates\classes\debug,结合到下面的图看:

..表示返回上级目录,..\..表示返回上两级目录,也就是返回到那层目录,然后明白这个了啥..\..\build\intermediates\classes\debug,指向debug目录,然后空格和后面隔离,
然后就是后面部分example.daosong.com.ndkdemo.NDK,看上图明白啥,是该类的全路径,这里有.隔离开,平时写类的全路径都是用的.号,生成头文件是将类对应的class文件生成二进制文件,所以要指向这里的,然后回车就能完成了头文件的生成。意思是将该文件目录下的NDK.class文件生成相应的头文件。打开jni目录下会有本地方法相应的映射方法定义。

在jni目录下建立C源文件


网上说需要在jni下多建一个空的C文件,不让会出错,到底出什么错我也不知道的,反正我多不多建都没有什么影响的,不过多建一个没什么影响,也就建了。

jni.c代码如下:

#include "example_daosong_com_ndkdemo_NDK.h"
//#include <android/log.h>
//#define  LOG_TAG  "System.out"
//#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG,  __VA_ARGS__)
//#define LOGINFO(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,  __VA_ARGS__)





JNIEXPORT jstring JNICALL Java_example_daosong_com_ndkdemo_NDK_getStringFromNative(JNIEnv * env, jobject obj){// LOGINFO("LOGINFO");
    return (*env)->NewStringUTF(env,"NDK 测试成功");
}jstring Java_example_daosong_com_ndkdemo_NDK_getString_1From_1c(JNIEnv * env, jobject jobject){return  (*(*env)).NewStringUTF(env,"NDK 来自于C文件");}

讲到这里如果要运行还得配置一个地方:

现在运行控制台就会打印相应的消息(至于为什么这么写,代码代表什么意思,我会在下一篇博客讲解),不像eclipse还要配置android.mk这么文件吗?android  studio不用,你还真猜对了,不过不是说不用就代表他没有,只不过这个配置过程不过你来做,你要做的就是配置上图的代码。那android.mk

在哪里的呢?看下图:

是不是是曾相识啊,对就是它。现在可以加上它了System.loadLibrary("MyJni");//导入生成的链接库文件

不知不觉就是深夜1点多了,下面给出我的工程,里面有log打印相关的知识,这个将在下一篇博客详细讲解,如果有什么错误,欢迎大家指出。

http://download.csdn.net/detail/tuoguang/9068899

点击右边,选择你解压的NDK,点击应用。这一步将工具包关联到android  studio。

在 local.properties 文件中设置ndk的路径:

就是你解压的NDK工具集的路径  我的是 E:\Android\android-ndk-r10,注意要对应加斜杠

到这里我说JNI(有时说的NDK开发,一样的,叫法不同)环境初步建好了,不想eclipse那样什么cygwin啊,怎么还要ndk-build的啊,我说什么都不用,就用一个命令就行了,下面就开始我们的第一个小demo。

程序过程讲解:

一:头文件生成:

第一步:像平时一样将一个空的android工程。

第二部:前面说了,要用native来标识一个方法,告诉程序这是一个本地方法。程序如下

public class NDK extends Activity{static {System.loadLibrary("MyJni");//导入生成的链接库文件
    }public native String getStringFromNative();//本地方法
    public native String getString_From_c();protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.myjni);System.out.println(getStringFromNative());}public void onClick(View view) {System.out.println(getString_From_c());Toast.makeText(this, getStringFromNative(), Toast.LENGTH_LONG).show();}}
 这一步可以先不加这行代码:SloadLibrary("MyJni";//导入生成的链接库文件 ,因为这里还没有建立C文件,不能生成库文件。
 然后make project一下,目的就是编译成对应的class文件。然后根据生成的class文件,利用javah生成对应的 .h头文件。如果没有编译就执行javah命令会提示找不到这个类文件的。下面是我的工程界面;

这里说一下:我工程里面的本地方法显示是红色,我一开始以为不能进行JNI开发,或者有错误,包括我后面的C文件和头文件里面也有很多地方是红色的,我开始定义这些方法的时候是红色的,但是有时又不是的,不知道是android studio对NDK支持不太好,还是怎么得,但是后面开发JNI程序没有任何影响的。所以就没有关了,如果那位大神知道还望告诉我一下,将非常感激。
第三部:打开命令窗口,点击view ->ToolsWindows->Terminal,如下图:

进来后默认是指向当前的工程目录,接下来输入命令:cd app\src\main 回车,切换到main目录下:如图:
至于怎么理解命令,建议你去学一下linux系统,这事linux最基本的操作。
第四步:输入javah -d jni -classpath E:\Android\sdk\platforms\android-22\android.jar;..\..\build\intermediates\classes\debug example.daosong.com.ndkdemo.NDK(注意前后有英文的;号隔开的哈)  生成头文件(要先编译程序的,不然会报错)。可能有些人看到这里就茫然了,这么长怎么写出来的哟,这怎么记得到的,我告诉大家根本不用记,我给你说怎么得来的,你们就能很快写出来了,是不是真的哟,不信试一试的。
首先:javah是生成头文件需要的工具,这个很好记得把,相信学java是都用过的。-d jni 在工程下生成jni目录,到时会在这个目录下建JNI开始的C/C++源文件的。
-classpath E:\Android\sdk\platforms\android-22\android.jar 这个就是你SDK文件下android.jar所在的文件位置,找到后复制即可。在学java的时候讲了这个的,可以将E:\Android\sdk\platforms\android-22\android.jar配置到环境变量就可以不写出来,因为在生成头文件是需要这个jar包,因为我没有配置到环境变量,所以这里就显示写出来。这部分很好搞定把。前面好弄,那后面部分怎了弄得,相信学过linux的很快能够知道的。
..\..\build\intermediates\classes\debug example.daosong.com.ndkdemo.NDK 
首先是 ..\..\build\intermediates\classes\debug,结合到下面的图看:

..表示返回上级目录,..\..表示返回上两级目录,也就是返回到那层目录,然后明白这个了啥..\..\build\intermediates\classes\debug,指向debug目录,然后空格和后面隔离,
然后就是后面部分example.daosong.com.ndkdemo.NDK,看上图明白啥,是该类的全路径,这里有.隔离开,平时写类的全路径都是用的.号,生成头文件是将类对应的class文件生成二进制文件,所以要指向这里的,然后回车就能完成了头文件的生成。意思是将该文件目录下的NDK.class文件生成相应的头文件。打开jni目录下会有本地方法相应的映射方法定义。

在jni目录下建立C源文件


网上说需要在jni下多建一个空的C文件,不让会出错,到底出什么错我也不知道的,反正我多不多建都没有什么影响的,不过多建一个没什么影响,也就建了。

jni.c代码如下:

#include "example_daosong_com_ndkdemo_NDK.h"
//#include <android/log.h>
//#define  LOG_TAG  "System.out"
//#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG,  __VA_ARGS__)
//#define LOGINFO(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG,  __VA_ARGS__)





JNIEXPORT jstring JNICALL Java_example_daosong_com_ndkdemo_NDK_getStringFromNative(JNIEnv * env, jobject obj){// LOGINFO("LOGINFO");
    return (*env)->NewStringUTF(env,"NDK 测试成功");
}jstring Java_example_daosong_com_ndkdemo_NDK_getString_1From_1c(JNIEnv * env, jobject jobject){return  (*(*env)).NewStringUTF(env,"NDK 来自于C文件");}

讲到这里如果要运行还得配置一个地方:

现在运行控制台就会打印相应的消息(至于为什么这么写,代码代表什么意思,我会在下一篇博客讲解),不像eclipse还要配置android.mk这么文件吗?android  studio不用,你还真猜对了,不过不是说不用就代表他没有,只不过这个配置过程不过你来做,你要做的就是配置上图的代码。那android.mk

在哪里的呢?看下图:

是不是是曾相识啊,对就是它。现在可以加上它了System.loadLibrary("MyJni");//导入生成的链接库文件

不知不觉就是深夜1点多了,下面给出我的工程,里面有log打印相关的知识,这个将在下一篇博客详细讲解,如果有什么错误,欢迎大家指出。

http://download.csdn.net/detail/tuoguang/9068899

android studio下的NDK开发详解相关推荐

  1. Android studio下JNI(NDK)开发

    玩智能手机的都说android手机体验.流畅差苹果太远了,一方面是苹果的硬件确实牛逼,另一个原因在于开发语言上的选择,苹果使用了Objective-C来开发,而android使用了java.程序员都知 ...

  2. Android studio | Android studio下APP目录工程结构详解

    /********************************************************************* github:https://github.com/Mic ...

  3. Android Studio 下安卓 jni 开发错误 undefined reference to AndroidBitmap_getInfo

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 又掉坑里了 今天开发 uvc,又遇到了坑: 和之前的这个坑类似:Android Studio 下安卓 jni 开发错误 ...

  4. 在android studio中配置ndk开发环境

    环境:android studio 1.5 android-ndk-r10b 1.下载android-ndk-r10b,解压. 2.android studio创建新项目, 配置ndk环境 打开fil ...

  5. Android Studio配置优化最全详解

    适合第一次安装AS的新手,感谢网上的资源 是不是很多同学已经有烦恼出现了?电脑配置已经很高了,但是每次运行Android程序的时候就很卡,而且每次安装运行程序都要等待很长时间,如果是在开发后期需要不停 ...

  6. android启动器开发,Android启动器(Launcher)开发详解

    第1章  Launcher的诞生 1.1 Framework启动Launcher流程 1.2 Launcher自身启动流程 App-Launcher-数据加载和UI绑定 目录 [隐藏] 1 1.Lau ...

  7. Android 悬浮窗语音识别功能开发详解

    笔者是一个普通不能再普通的程序员,本着出处兴趣,花时间研究了一下,想实现手机的悬浮窗语音识别功能,这样不影响自己其它操作的,语音识别技术是用百度云语音sdk,应该不难实现,很难实现就是核心语音识别技术 ...

  8. Android BLE蓝牙4.0开发详解

    这篇博客主要讲解 蓝牙 BLE 的用法.在讲解之前先讲一些概念性的东西,对于之前没接触过蓝牙开发,现在手上又有个蓝牙BLE项目需要做的人,先看下这些概念还是很重要的.因为我之前就是这样,之前没有接触过 ...

  9. android 启动器开发,Android启动器(Launcher)开发详解

    目录 [隐藏] 1 1.Launcher桌面数据和主菜单数据加载流程 1.1 1.1 加载主菜单数据 1.1.1 1.加载调用流程 1.2 1.2 加载桌面数据 1.3 1.3 插入SIM卡时候的数据 ...

最新文章

  1. 产品经理如何做好数据埋点
  2. QT调用C#写的Dll
  3. TOMCAT配置管理员
  4. 【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )
  5. Spring Boot 集成 MyBatis 与 c3p0
  6. 小米蓝牙左右互联_解决不同品牌智能家居的兼容问题,小米米家智能多模网关发布...
  7. collection集合 地址_有容乃大--Java 集合(List/Set/Map)
  8. java解析xml串标签_Java反射解析XML字符串并封装到指定的JavaBean
  9. java参数传递的乱码问题
  10. Java面试题超详细讲解系列之九【SQL语句篇】
  11. 多重继承有时候确实有必要
  12. NASA 用哈勃望远镜定格你的星空
  13. 口算加密php怎么使用,从数盲到口算 ——带你玩转RSA加密算法(一)
  14. mysql 月初 月末_月初月末sql语句(日期所在月的第一天,最后一天)
  15. 大数据架构选型与设计
  16. 关于微软邮箱启用OAuth2.0身份认证后Foxmail无法正常收取邮件的解决办法
  17. SaaS,PaaS和IaaS在一张图中进行了解释
  18. 阿里店铺如何制作并导出数据包
  19. 济南ISO27001信息安全管理体系
  20. 机器学习 之 EM算法

热门文章

  1. 【错误记录】Kotlin 编译报错 ( Type mismatch: inferred type is String? but String was expected )
  2. 【Android 异步操作】Handler 机制 ( MessageQueue 空闲任务 IdleHandler 机制 )
  3. 【计算机网络】网络层 : IPv6 协议 ( IPv6 数据包格式 | IPv6 地址表示 | IPv6 地址类型 | IPv4 与 IPv6 协议对比 | IPv4 -> IPv6 过渡策略 )
  4. 【Android 高性能音频】Oboe 函数库简介 ( Oboe 简介 | Oboe 特点 | Oboe 编译工具 | Oboe 相关文档 | Oboe 测试工具 )
  5. 【Android 应用开发】Activity生命周期 与 Activity 之间的通信
  6. [Spring cloud 一步步实现广告系统] 13. 索引服务编码实现
  7. 洛谷 T61816 代数式的最值
  8. 链表是否带环、环入口、环长度、链表相交问题分析与总结
  9. Android ContentProvider介绍
  10. C语言中的位操作(8)--根据指定掩码选择两数之一