在我写这篇文章的时候,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. PHP实现验证码图片

    <?php header("Content-type: image/png"); session_start(); $authnum = ''; $str = 'abcdef ...

  2. thinkphp CURD 1

    二.ThinkPHP 3 读取数据    (重点)    对数据的读取 Read    $m=new Model('User');    $m=M('User'); select    $m-> ...

  3. bmp图片显示

    文件IO项目: 在开发板屏幕上循环显示目录里的图片 a.按照一定的间隔循环显示目录里的bmp图片 b.实现手指滑动来显示目录里的图片(bmp,jpg)上一张,下一张 d1: 1.能操控屏幕(查询开发板 ...

  4. 用Zephir编写PHP扩展

    自从NodeJS,和Golang出来后,很多人都投奔过去了.不为什么,冲着那牛X的性能.那PHP的性能什么时候能提升一下呢?要不然就会被人鄙视了.其实大牛们也深刻体会到了这些威胁,于是都在秘密开发各种 ...

  5. eclipse xml自动提示

    找到所需要的dtd文件: window->preferences->xml->xml catalog : public id 输入对应的字符串:

  6. css块级标签,行内标签,行内块标签的转换(2)

            css块级标签,行内标签,行内块标签的转换 版权声明 本文原创作者:雨点的名字 作者博客地址:https://home.cnblogs.com/u/qdhxhz/ 在基础1中,我详细讲 ...

  7. 利用apache的mod_rewrite做URL规则重写

    使用mod_rewrite做url重写,伪静态,做过很多次,这次用几个例子记下来,便于后面查用. 使用方法: 1.在conf目录的httpd.conf文件中找到: LoadModule rewrite ...

  8. ubuntu14.04 下手动安装java jdk

    ubuntu14.04 下手动安装java jdk 第一步: 下载jdk.tar.gz (这里假设下载的文件名为jdk.tar.gz) 第二步: 解压 sudo tar -zxvf ./jdk.tar ...

  9. [CSS3] 学习笔记-CSS3盒子样式

    1.盒子的类型 在CSS3中,使用display来定义盒子的类型,包括block,inline,inline-block类型.div元素和P元素,属于block类型,span元素和a元素,属于inli ...

  10. HTML5学习之语义化标签(一)

    一.为什么HTML5要引入新语义标签 在HTML5出现之前,我们一般采用DIV+CSS布局我们的页面.但是这样的布局方式不仅使我们的文档结构不够清晰,而且不利于搜索引擎爬虫对我们页面的爬取.为了解决上 ...