Administrator
Published on 2022-01-22 / 181 Visits
0
0

NDK入门(CMake / ndk-build)

官方入门

https://developer.android.google.cn/ndk/guides/
1.其中说:
Android Studio 编译原生库的默认构建工具是 CMake。由于很多现有项目都使用 ndk-build 构建工具包,因此 Android Studio 也支持 ndk-build。
说明有两种构建方式,CMake / ndk-build 。
主流应该是cmake。

基本例子(CMake)

一.过程

1.创建项目

android studio 可以直接创建c++调用动态库的例子,这种属于CMake的。
说明(包含CMakeLists.txt说明),可以看到有CMakeLists.txt文件:https://blog.csdn.net/afei__/article/details/80897404
image.png

2.添加配置

这种方式build.gradle需要加一下配置:
image.png
(对于version "3.10.2",官方是这样说明的:SDK 管理器包含 CMake 的 3.6.0 派生版本和版本 3.10.2。未设置特定 CMake 版本的项目使用 CMake 3.10.2 进行构建。如需设置 CMake 版本,请将以下内容添加到模块的 build.gradle 文件中。说明此属性是用来指令CMAKE工具版本的)

3.编写正确的函数名

在编写cpp文件时,方法名有规则(JNI正确调用的规则,静态注册):
image.png

4.调用

JAVA调用类指的是包含System加载库方法的类:
image.png
这种规则时严格对应的,不然调用会出错。

二.调用流程

1.Gradle 调用您的外部构建脚本 CMakeLists.txt。
2.CMake 按照构建脚本中的命令将 C++ 源文件 native-lib.cpp 编译到共享的对象库中,并命名为 libnative-lib.so,Gradle 随后会将其打包到 APK 中。
3.运行时,应用的 MainActivity 会使用 System.loadLibrary() 加载原生库。现在,应用可以使用库的原生函数 stringFromJNI()。
4.MainActivity.onCreate() 调用 stringFromJNI(),这将返回“Hello from C++”并使用这些文字更新 TextView。

基本例子(ndk-build / Android.mk)

语法说明

https://blog.csdn.net/afei__/article/details/84069876

与makefile的区别

https://www.jianshu.com/p/8bd7d430babc

实践

1.Android.mk其实可以看成是安卓类型的makefile,也是用来构建.a .so的一种构建脚本。
2.它使用的是ndk工具来构建的,ndk配合Android.mk是可以脱离项目/android studio/gradle来构建的.a .so 文件的。(另外一种方式cmake则需要配合gradle来构建)
3.Android.mk一般应该得配合Application.mk来构建库的,且Android.mk可以包含多个子Android.mk,如图可以看到通过subdirs引用了其他两个子Android.mk。
image.png
4.有了Android.mk文件,可以在当前目录下,执行ndk-build命令来构建库(ndk要在当前系统环境变量中,对应的清除ndk-build clean),默认构建是在Android.mk的目录的同级别下,如图可以看到obj下的local目录就是生成的动态库:
image.png
5.有个库文件,我们一般为了方便直接复制local目录下的所有文件到main目录下的libs目录,软件就可运行起来了。(这个libs目录路径得前提在gradle配置的),但是注意,全部复制过去,打包出来的apk是安装不了的,要能安装,不能全部复制过去,而是只复制so文件打包处理的才能安装。(怀疑可能是打包自动只打包a文件进去了,但是手机系统又不支持,前后对比,只复制打包so文件的apk安装包,是会大1.2m的)
6.上面说的配置libs路径,如图在gradle文件中配置:
image.png


Comment