Android NDK开发 (入门)

NDK简介

1.NDK是一系列工具的集合

NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

2.NDK提供了一份稳定、功能有限的API头文件声明

Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。

优点

  • 代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
  • 可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
  • 提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
  • 便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

NDK开发环境的搭建

NDK和CMake 的下载和安装

可以直接通过打开SDK进行下载和安装

这里写图片描述

由于NDK的工具包较大, 也可以选择从网站中下载: https://developer.android.google.cn/ndk/downloads/index.html, 选择自己对应的版本下载即可, 不过通过这种方法一定要修改local.properties文件, 在里面添加:

//后面改成自己下载后解压的路径名
ndk.dir=E:\ProgramFiles\Android\NDK\android-ndk-r16-beta1

也可以如下图,点击Project Structure(或者点击File,选择Project Structure),然后选择Android NDK location(NDK的解压目录)点击ok就行了。

这里写图片描述

关于CMake

1.CMakeList.txt 是脚本文件, 需要指定包含哪些源代码;
2.可以写一些条件语句, 实现不同的代码包含
3.add_library 表示编译一个代码库, 内部包含了代码库的名称, 以及源代码有哪些

扫描二维码关注公众号,回复: 10242451 查看本文章

NDK两种开发模式
1.ndk-build 形式; Android Studio 2.2之前的模式
2.CMake 形式: CLion C/C++编辑器; AS2.2之后整合了CLion代码, AS就支持了CMake形式的NDK开发

创建工程

1.新建工程, 选中Include C++ Support
这里写图片描述

2.一路Next之后, 在最后Finish页面尽量选中图示两项, 这样会给我们包裹一些特定的示例代码, 帮助我们理解和使用
这里写图片描述

3.在app的build.gradle配置需要.so文件(还未生成.so文件)
这里

4.修改native-lib.cpp内容
这里写图片描述

5.查看下MainActivity内容
这里写图片描述

6.运行项目
这里写图片描述

7.查看生成的.so文件
这里写图片描述

Note1
C代码库生成的名称规则
1. 如果栈顶代码库名称为 “nh” 那么生成的文件必定是libnh.so
命名规则: lib库名.so
2. System.loadLibrary(库名); //此处不能包含前面的lib和后面的.so

对于JNIEnv *env来说,在C中调用:

Note2
(*env)->NewStringUTF(env, “Hello from JNI!”);

而在C++中如果按照上述调用则会发生’base operand of ‘->’ has non-pointer type ‘_JNIEnv”错误,需要如下调用:

env->NewStringUTF(“Hello from JNI!”);

原因:参见jni.h中对于JNIEnv的定义:

#if defined(__cplusplus)

typedef _JNIEnv JNIEnv;

#else

typedef const struct JNINativeInterface* JNIEnv;

#endif

github地址

发布了40 篇原创文章 · 获赞 45 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/CGG92/article/details/78973433