利用Android Studio的CMake来快速开发NDK

关于Ndk的开发,网上已经有许许多多的文章可供学习参考,但是大多都是利用javah -jni xxx.xxx.xxxJni的方法去构造出一个jni粘合层的头文件。然后再去链接自己的本地方法。

的确学习这种方法更有助于了解ndk的本质。但是这里我使用CMake来快速开发NDK,这个也是最新版的Android Studio所提供的(ps:我使用的是Android studio 2.4 preview)

前方可能需要你科学上网


CMake,是一种可扩展的开源系统,可以在操作系统中以编译器独立的方式管理构建过程。与许多跨平台系统不同,CMake被设计为与本地构建环境一起使用。放置在每个源目录(称为CMakeLists.txt文件)中的简单配置文件用于生成标准构建文件(例如,Unix中的makefile和Windows MSVC中的项目/工作区),这些文件以常规方式使用。CMake可以生成一个本地构建环境,它将编译源代码,创建库,生成包装器并以任意组合构建可执行文件。

NDK,Android Native Development Kit(本地开发工具),我所理解的本地,就是一些已经静态加载好的,不需要在运行时使用JVM再去动态加载。如果理解有偏差请指正。

不说废话,立刻开锤。


  1. 安装CMake、LLDB和NDK。
    打开SDK Manager
    安装

  2. 新建一个新的AS工程(这里请大家别着急)
    新建工程
    切忌需要勾选include C++ Support 不然你就无法使用CMake进行快速构建环境,又要回到命令行去一个个的生成本地头文件。
    接着就是无脑下一步就可以了。

  3. 打开Project工程视图

    Project工程视图
    可以看到CMake帮我们在main目录下生成了一个cpp目录,是不是与你使用以前方法创建的jni目录有点类似?对的,其实他们本质是一样的。为什么这样说,我们来查看一下Cmake最重要的一个配置文件,CMakeList.txt
    CmakeList.txt
    红色区域就是告诉ndk-build我这里需要添加一个本地lib。
    接下来我们看看他是怎么将这个CMakeList.txt包含进来的。
    打开app的build.gradle文件。
    build.gradle

    是不是想说一声:原来如此。

  4. 环境已经配好,就可以开始写我们的本地方法了。这里以fibonacci作为一个例子。
    cpp下新建一个fibonacci.c

    
    uint64_t fibonacci(unsigned int n){
        if (n > 1) return fibonacci(n-2) + fibonacci(n -1);
        return n;
    }

    再新建一个my-jni-lib.cpp文件

    //
    // Created by GeekHades on 17/5/11.
    //
    
    
    #include <jni.h>
    
    
    #include "fibonacci.c"
    
    
    extern "C"
    JNIEXPORT jlong JNICALL
    Java_org_hades_myndkprojecttest_MyJniUtils_fibonacci(JNIEnv *env, jobject instance, jint i) {
    
        // TODO
        return fibonacci(i);
    }

    这里有几个参数可能很多文章都没有说明过,第一个参数JNIEnv * 这是一个JNI环境本身的一个指针,使用它可以与JVM进行交互。

    第二个参数 当方法被声明为静态时staticjclass类型,否则为jobject类型。第三个参数就是这个方法本身需要的形参。
    接下来是MyJniUtils.java
    MyJniUtils.java
    这里需要说的是三个地方,
    第一,static区域块中的

    System.loadLibrary(“native-lib”);
    System.loadLibrary(“my-jni-lib”);

    是要引进cpp目录中的lib。至于他怎么找到的就是靠CMakeList.txt

    第二,native的两个方法,其中fibonacci是我自己创建的包含在my-jni-lib.cpp这个文件中,stringFromJNI是AS构建的时候创建的包含在native-lib.cpp这个文件中,我之所以分开是想告诉大家可以随便创建你自己的本地方法。只需要按照CMAKE的语法来就行。
    第三,也是AS中最人性化的一点,在行数右边的两个箭头,你只要点击它就会索引到这个方法所在的jni粘合层中(注意是粘合层和不是这个方法所在的.c文件),还有值得注意的一点是:* 当你没有创建本地方法的时候先创建了native方法,AS会给你报错,你只要点击小灯泡他就会帮你自动创建一个本地索引。非常方便。*

  5. 吹了大半天,最后演示一下效果:
    先来看一下MainActivity.java这里为了方便测试我就直接对文本设置了点击事件,点击后调用fibonacci(10);
    MainActivity.java

效果图1

效果图2


最基本的NDK开发流程就是这样了,文章中有错误的地方欢迎指正。共同进步!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值