最近没什么事,就想将十年前公司eclipse写的jni项目转化到Android Studio工程,并使用新的构建工具CMake。
从eclipse转AS工程很简单,直接用as自带的转换即可。最麻烦的部分就是jni那块,该文章主要介绍CMakeList.txt脚本的编写,以及Android.mk里面命令跟CMakeList.txt命令的对比。
一、首先将eclipse工程转为Android studio,并关联上jni
转换项目工程我就不说了,直接选择Import project(Gradle,Eclipse ADT,etc.)。
然后导入你的eclipse工程,等构建完毕后(编译的时候可能不会报错,运行才会提示),这个时候jni还并没有关联上。
第一种你可以直接运行,然后报错的时候as会提示你关联jni。
第二种方式,右键app->Link C++ Project with Gradle,如下图(一定要是右键Module,在Project右键是没有的)
然后会让你选择用哪种构建方式,有两种:
1. CMake:Android studio新的构建方式,Project Path需要选择CMakeList.txt文件路径,jni会按照这个脚本来进行编译,具体脚本的编写看下面。
2. ndk-build:老eclipse的构建方式,也就是Android.mk的形式。
点击ok之后就会开始构建,其实这个选择也就是在gradle里面加一句话而已。
二、编写CMakeList.txt,以及跟Android.mk的对比
1.设置需要设置构建jni所需的CMake的最低版本
cmake_minimum_required(VERSION 3.4.1)
2.设置生成的so动态库最后输出的路径,如果项目的so库不需要给别人使用,也可以不设置,不设置的话会生成在build里面,如果给别人使用,寻找的话还是比较麻烦,所以指定一下路径更方便。
# 设置生成的so动态库最后输出的路径,set后面两个参数,
# 前面一个是命令,后面是路径。
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
- CMAKE_LIBRARY_OUTPUT_DIRECTORY : 指定的命令,用于设置输出的路径
- ${PROJECT_SOURCE_DIR} :是指当前路径,也就是CMakeList.txt所在的路径,其实也可以不写,因为默认就是以CMakeList.txt所在的路径为起点。
- ../jniLibs: ..两个点是回到上一层,一般来说我们都是建个jni文件夹用于放置c文件,CMakeList.txt是在jni文件夹下,也就是回到上一层,存放在jniLib里面。
- ${ANDROID_ABI} 会根据架构来生成不同的文件夹放置对应的so文件。