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

来源:互联网 发布:联影 算法怎么样 编辑:程序博客网 时间:2024/05/22 00:15

关于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 JNICALLJava_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 0
原创粉丝点击