Android NDK开发 Android.mk 转化 CMakeList.txt

最近没什么事,就想将十年前公司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})
  1. CMAKE_LIBRARY_OUTPUT_DIRECTORY : 指定的命令,用于设置输出的路径
  2. ${PROJECT_SOURCE_DIR} :是指当前路径,也就是CMakeList.txt所在的路径,其实也可以不写,因为默认就是以CMakeList.txt所在的路径为起点。
  3. ../jniLibs: ..两个点是回到上一层,一般来说我们都是建个jni文件夹用于放置c文件,CMakeList.txt是在jni文件夹下,也就是回到上一层,存放在jniLib里面。
  4. ${ANDROID_ABI} 会根据架构来生成不同的文件夹放置对应的so文件。
  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在进行NDK开发时,Android.mk文件是非常重要的一个文件,它用来描述你的Native代码库的模块依赖关系、编译选项等信息。下面是Android.mk文件编写的一些基本规则和示例。 1. Android.mk文件基本结构 Android.mk文件由一系列的变量定义、模块声明和编译选项等组成。下面是一个基本的Android.mk文件结构: ``` LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mymodule LOCAL_SRC_FILES := mymodule.c LOCAL_LDLIBS := -llog -landroid include $(BUILD_SHARED_LIBRARY) ``` 其中,`LOCAL_PATH`指定了当前目录路径;`CLEAR_VARS`清除之前的变量定义;`LOCAL_MODULE`指定了模块名称;`LOCAL_SRC_FILES`指定了源代码文件;`LOCAL_LDLIBS`指定了链接库;`BUILD_SHARED_LIBRARY`指定了编译成共享库。 2. 添加多个源文件 如果一个模块由多个源文件组成,可以使用`LOCAL_SRC_FILES`变量指定多个源文件,例如: ``` LOCAL_SRC_FILES := file1.c \ file2.c \ file3.c ``` 3. 添加头文件路径 如果源文件中包含了其他头文件,可以使用`LOCAL_C_INCLUDES`变量指定头文件路径,例如: ``` LOCAL_C_INCLUDES := $(LOCAL_PATH)/include ``` 4. 添加编译选项 如果需要添加编译选项,可以使用`LOCAL_CFLAGS`和`LOCAL_CPPFLAGS`变量,例如: ``` LOCAL_CFLAGS := -Wall -O2 LOCAL_CPPFLAGS := -std=c++11 ``` 5. 添加链接库 如果需要链接其他库,可以使用`LOCAL_LDLIBS`变量,例如: ``` LOCAL_LDLIBS := -llog -landroid ``` 6. 添加静态库 如果需要链接静态库,可以使用`LOCAL_STATIC_LIBRARIES`变量,例如: ``` LOCAL_STATIC_LIBRARIES := libfoo libbar ``` 7. 使用预编译头文件 如果需要使用预编译头文件,可以使用`LOCAL_CXX_FLAGS`变量,例如: ``` LOCAL_CXX_FLAGS += -include myheader.h ``` 8. 模块依赖关系 如果一个模块依赖于另外一个模块,可以使用`LOCAL_STATIC_LIBRARIES`或`LOCAL_SHARED_LIBRARIES`变量来声明依赖关系,例如: ``` include $(CLEAR_VARS) LOCAL_MODULE := libfoo LOCAL_SRC_FILES := foo.c include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libbar LOCAL_SRC_FILES := bar.c LOCAL_STATIC_LIBRARIES := libfoo include $(BUILD_SHARED_LIBRARY) ``` 上面的例子中,模块`libbar`依赖于模块`libfoo`。 以上就是Android.mk文件编写的一些基本规则和示例,希望能够对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值