在我写这篇文章的时候,Android Studio已经是2.3版本了,已经集成CMake 编译工具,
用户只需在 新建项目的时候,添加选项(Include C++ support),Android Studio就会自动
帮你部署好相应的NDK环境。但我还是想尝试使用 Android.mk 配置文件方式来实现NDK开发,
了解其配置的原理,然后再使用 CMake 来部署,这样能了解两者间的区别。后续的文章就会写
到用CMake来部署NDK环境。
 
     假设你已经安装好了 Android Studio 与NDK 环境。
建议将ndk-build所在目录加入PATH环境变量,以便后续调试。
1、打开 File => Project Structure 如下:
 
如果选框中为空,说明你没有配置好NDK环境。
 
2、copy 路径, 然后打开如下 windows 系统下的环境变量
 
在 Path 变量里添加你的 NDK路径,即上一步copy的内容,记住在路径前添加 ; 分号。
确定之后,就在Windows 命令窗口 输入 ndk-build,得到如下图,说明你配置成功了。
 
下面我们来新建一个Android项目,实现一个简单的NDK方法。
1、创建一个NDKUtils.Java类, 新建一个 native 方法,
public native String invokeCmethod();
 
然后在该类 添加如下代码,即载入库的含义:
     static {
          System.loadLibrary("NDKUtils");//导入生成的链接库文件
      }
 
2、点击 菜单 Build =>Make Project,就会编译项目,然后在
你的项目跟路径 app\build\intermediates\classes\debug\com\magicing\eigenndk
可以看到 NDKUtils.class 文件(com\magicing\eigenndk 是包名,对应你自己的包名)
 
3、进入Android Studio命令行页面:
 
如果你没有这个选项,则你从 View菜单栏里 Tool Windows => Terminal 调出该页面。
 
输入如下命令:
      cd app/src/main   // 进入该路径
      然后执行下面编译命令
      javah -d jni -classpath F:\AndroidSDK\platforms\android- 23\android.jar;..\..\build\intermediates\classes\debug com.magicing.ndktest2.NDKUtils
 
解释(根据自身的情况来设置):
    F:\AndroidSDK\platforms\android-23\android.jar;   //是你的SDK路径,
    ..\..\build\intermediates\classes\debug                  //相对路径,都一样
    com.magicing.ndktest2.NDKUtils                          // NDKUtils 的命名空间
 
4、当上述的命令执行成功后,在app/src/main 多了一个 jni 文件夹,里面有一个
    com_magicing_eigenndk_NDKUtils.h 文件。在该路径下copy 一个相同名,后缀
    为 .c 的文件 com_magicing_eigenndk_NDKUtils.c 。然后该文件就是C 语言的实现文件。
 
    把如下方法调整一下(完善参数命名,且添加一个大括号),得到如下:
/*
* Class: com_magicing_eigenndk_NDKUtils
* Method: invokeCmethod
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_magicing_eigenndk_NDKUtils_invokeCmethod
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"NDK 获取Native 字符串");
}
 
5、在jni 目录下创建 Android.mk 配置文件,内容如下:
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NDKUtils
LOCAL_SRC_FILES := com_magicing_eigenndk_NDKUtils.c
include $(BUILD_SHARED_LIBRARY)
 
 
6、在jni 目录下创建 Application.mk 配置文件,内容如下:
 
APP_PLATFORM := android-23
APP_ABI := armeabi
 
 
7、然后继续在命令行端口执行 ndk-build 命令,得到如下:
 
该命令是编译C文件,然后生成 .so 文件,生成在 app\src\main\libs 目录下。
ndk-build 还有很多参数,大家可以去查询一下其它资料,如果有时间,我后续篇幅详细讲一下。
 
8、配置根目录下的 build.gradle 文件
 
主要添加如下代码:
    sourceSets{
        main{
               jni.srcDirs = [] // disable automatic ndk-build call, which ignore our Android.mk
               jniLibs.srcDir 'src/main/libs'
              }
     }
 
这样, native invokeCmethod 方法算是衔接好了,只有在MainActivity 上实例化这个类,然后
调用 这个方法,就能输出相应的字符串,这样就简单的实现NDK功能。
 
项目的目录大概如下:

NDK 开发(Android.mk配置)的更多相关文章

  1. NDK开发,如何配置 debug环境

    刚开始做NDK 开发的时候,Android Studio 还没提供了 native C/C++ 设置断点 调试,我们都是通过输出 日志来调试,这样费时耗力.Android Studio 应该是在 2. ...

  2. Android流媒体开发之路二:NDK开发Android端RTMP直播推流程序

    NDK开发Android端RTMP直播推流程序 经过一番折腾,成功把RTMP直播推流代码,通过NDK交叉编译的方式,移植到了Android下,从而实现了Android端采集摄像头和麦克缝数据,然后进行 ...

  3. Android流媒体开发之路三:基于NDK开发Android平台RTSP播放器

    基于NDK开发Android平台RTSP播放器 最近做了不少android端的开发,有推流.播放.直播.对讲等各种应用,做了RTMP.RTSP.HTTP-FLV.自定义等各种协议,还是有不少收获和心得 ...

  4. 用C++语言开发Android程序 配置开发环境

    转自:http://www.cnblogs.com/yaotong/p/3622430.html 用C++语言开发Android程序 配置开发环境   如果你是一个C++语言的死忠,你喜欢C++语言到 ...

  5. 【NDK开发】使用NDK开发android

    今天学习了一下android NDK,所以记录下来.据说NDK从r7开始自带编译器,在windows上无需配置cygwin的环境.现在我使用NDK r10来开发. 上午搭建的NDK并写了一个实例,不过 ...

  6. 【转】基于eclipse进行ndk开发的环境配置

    前述虽然我们在其他的博文中(如https://blog.csdn.net/ericbar/article/details/76602720),早就用到了ndk,但如果想在Android设备运行包含这些 ...

  7. 使用as开发jni入门(附验证):配置ndk开发环境,配置as相关jni配置

    编写jni,生成so文件: 1.通过as内置的Android SDK下载需要使用的ndk,在系统环境变量设置相关参数 2.新建一个普通as项目,新建一个类,用来静态加载so库和书写本地native方法 ...

  8. NDK(10)Android.mk各属性简介,Android.mk 常用模板

    参考 : http://blog.csdn.net/hudashi/article/details/7059006 本文内容: Android.mk简介, 各属性表, 常用Android.mk模板 1 ...

  9. NDK(10)Android.mk各属性简介,Android.mk 常用模板--未完

    参考 : http://blog.csdn.net/hudashi/article/details/7059006 1. Android.mk简介 Android.mk文件是GNU Makefile的 ...

随机推荐

  1. Spring mvc系列一之 Spring mvc简单配置

    Spring mvc系列一之 Spring mvc简单配置-引用 Spring MVC做为SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块 ...

  2. 2.10. 代码片段:demo方法(Core Data 应用程序实践指南)

    该代码段我觉得没有太多东西 - (void)applicationDidBecomeActive:(UIApplication *)application { [self cdh]; [self de ...

  3. linux下安装TensorFlow(centos)

    一.python安装 centos自带python2.7.5,这一步可以省略掉. 二.python-pip pip--python index package,累世linux的yum,安装管理pyth ...

  4. mysql表名忽略大小写

    安装完数据库,建表查询发现表不存在,原来是表名大小写写错了,原来Linux下的MySQL默认是区分表名大小写的,这样的话对变成灰带来很大的不变,如何才能使mysql表名不区分大小写呢? 通过如下设置, ...

  5. java中的静态代理和动态代理,入门整理

    静态代理和动态代理主要解决的问题是:在直接访问对象时带来的问题,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后 ...

  6. editormd使用教程

    对于现在的程序员来说,都需要一个快速写文章的语言,那么无非就是markdown了,市面上markdown编辑器并不多,而且也不怎么好用,现在推荐国内的比较牛逼的. 入门 建议先到官方看下如何使用,避免 ...

  7. 用虚拟 router 连通 subnet - 每天5分钟玩转 OpenStack(141)

    Neutron Routing 服务提供跨 subnet 互联互通的能力.例如前面我们搭建了实验环境: cirros-vm1      172.16.100.3        vlan100 cirr ...

  8. 20个常用的Java程序块

    1.字符串有整型的相互转换 String a = String.valueOf(2);//integer to numeric string Int i = Integer.parseInt(a);/ ...

  9. [css]《css揭秘》学习(四)-一个元素实现内圆角边框

    如图所示的圆角边框有两个元素很好实现,用一个元素也可以实现. <html> <head> <meta charset="utf-8"> < ...

  10. js里的神奇双引号的长度

    "和"这两个引号(注意不是和字,是两侧的两个引号),你看出什么区别了么? 一个是复制进来的,另外一个是写上的,应该是半角英文了? "".length " ...