利用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再去动态加载。如果理解有偏差请指正。
不说废话,立刻开锤。
安装CMake、LLDB和NDK。
打开SDK Manager新建一个新的AS工程(这里请大家别着急)
切忌需要勾选include C++ Support 不然你就无法使用CMake进行快速构建环境,又要回到命令行去一个个的生成本地头文件。
接着就是无脑下一步就可以了。打开Project工程视图
可以看到CMake帮我们在main
目录下生成了一个cpp
目录,是不是与你使用以前方法创建的jni目录有点类似?对的,其实他们本质是一样的。为什么这样说,我们来查看一下Cmake最重要的一个配置文件,CMakeList.txt
。
红色区域就是告诉ndk-build
我这里需要添加一个本地lib。
接下来我们看看他是怎么将这个CMakeList.txt
包含进来的。
打开app的build.gradle
文件。是不是想说一声:原来如此。
环境已经配好,就可以开始写我们的本地方法了。这里以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进行交互。
第二个参数 当方法被声明为静态时
static
为jclass
类型,否则为jobject
类型。第三个参数就是这个方法本身需要的形参。
接下来是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会给你报错,你只要点击小灯泡他就会帮你自动创建一个本地索引。非常方便。*吹了大半天,最后演示一下效果:
先来看一下MainActivity.java
这里为了方便测试我就直接对文本设置了点击事件,点击后调用fibonacci(10);
最基本的NDK开发流程就是这样了,文章中有错误的地方欢迎指正。共同进步!
- 利用Android Studio的CMake来快速开发NDK
- Android Studio 2.3利用CMAKE进行OpenCV 3.2的NDK开发
- android studio利用cmake实现NDK
- 使用CMake来进行Android NDK开发
- 使用CMake来进行Android NDK开发
- 使用CMake来进行Android NDK开发
- Android Studio配置CMake开发NDK
- Android studio ndk配置cmake开发native C
- Android Studio 2.2 NDK 开发 之 cMake 方式
- Android Studio利用Gradle进行NDK开发
- android studio 2.2 利用NDK 开发
- Android NDK的初步认识(Android Studio 2.2 + CMake)
- android studio的ndk开发
- NDK开发 从入门到放弃(七:Android Studio 2.2 CMAKE 高效NDK开发)
- NDK开发 从入门到放弃(七:Android Studio 2.2 CMAKE 高效NDK开发)
- NDK开发 从入门到放弃(七:Android Studio 2.2 CMAKE 高效NDK开发)
- NDK开发 从入门到放弃(七:Android Studio 2.2 CMAKE 高效NDK开发)
- NDK开发 从入门到放弃(七:Android Studio 2.2 CMAKE 高效NDK开发)
- Android应用设置多个启动图标,动态列换应用图标
- 获取泛型的Class类型
- Butterknife的使用
- 数值得整数次方--模拟pow函数的功能
- csapp 实验二 二进制炸弹
- 利用Android Studio的CMake来快速开发NDK
- multipart/form-data post 方法提交表单,后台获取不到数据
- C++ primer plus 阅读记录-使用类
- leetcode之单链表题目汇总
- bat脚本学习 --参数传递
- lua中table操作的相关函数
- html5的学习笔记
- 深度神经网络结构以及Pre-Training的理解
- Java8:函数式编程与Lambda表达式