AndroidStudio2.2.x以上使用cMake编译调用底层c生成依赖库
最近使用AndroidStudio的最新ndk编译方式cMake来编译底层cpp文件,由于之前没有接触过cMake语法,先附上官方学习文档地址:https://developer.android.com/ndk/guides/cmake.html,以及友情中文翻译网址:https://www.zybuluo.com/khan-lau/note/254724;
底层c文件一大堆,如下图所示

问题一:
其中native-lib.cpp是提供对外接口的,所以对其他文件的依赖都写在了该文件中,接下来直接编译吗?no,那样你会得到编译错误,在native-lib.cpp中找不到其他c文件里边的函数。所以是cMake编译的时候没有把那些c文件编译进去,这样要去CMakeLists.txt中去添加文件了。
未修改之前的CMakeLists.txt文件内容是这样的:
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.4.)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
EXCLUDE_FROM_ALL
# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp
)
学习CMake的官方文档可以知道,其中的add_library()正是设置生成包的地方,这里只有native-lib.cpp一个文件,理论上应该要包括其他那些的,那么加上其他那几个文件就好了吧?是可以这样,但是那么多文件,未免也太长了吧,当然CMake肯定预料到这种问题了,所以我们可以get一个新技能,使用aux_source_directory(),在源文件位置添加文件列表,而不是单个文件,get修改之后的文件内容如下:
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.4.)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
aux_source_directory(src/main/cpp SRC_LIST)
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
EXCLUDE_FROM_ALL
# Provides a relative path to your source file(s).
#src/main/cpp/native-lib.cpp
${SRC_LIST}
)
这样子改完需要Synchronize同步一下,这样就可以重新编译了。
问题二:
在编译通过之后,运行调用底层代码,结果程序崩溃了,提示java.lang.UnsatisfiedLinkError: Native method not found: ***;好吧,没有找到这个底层方法?可是明明已经生成了,仔细观察上图代码结构可以发现,由于AndroidStudio自动生成的底层文件是.cpp的,也就是使用了c++的语法规则,而其他的底层文件都是.c的使用的c语言规则,他们两者之间还是有区别的,现在需要在cpp文件中调用c文件,那么要在cpp文件中做些修改,首先头文件包含c的是相同的,不同点是在使用c文件中的函数上方,加一行 extern "C" 即可。这样重新编译运行,一切正常!
AndroidStudio2.2.x以上使用cMake编译调用底层c生成依赖库的更多相关文章
- linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记
上篇文章 小记了: 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记. http://www.cnblogs.com/bleachli/p/4352 ...
- win7下cmake编译opencv2.3.1生成opencv—createsamples.exe和opencv_haartrainingd.exe
第一步:下载安装cmake,之后进行默认安装即可,这步略过. 第二步:配置cmake ,使cmake找到opencv进行编译安装 watermark/2/text/aHR0cDovL2Jsb2cuY3 ...
- CMAKE编译时如何自动下载第三方库并解压、安装到指定目录
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 在日常开发过程中难免会使用到第三方库或者需要将部分库分离另外存储,如果将库与代码放在一起难免会造成工程庞大,此时就可 ...
- windows端ndk 编译.c/cpp文件生成so库示例
- 使用CMake编译跨平台静态库
在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑.因为很多开源的程序,比如png,都是自带编译脚本的.我们可以使用下列脚本来进行编译: . / con ...
- CMake编译OpenCV
使用CMake来编译OpenCV,以匹配自己使用的VS版本. 主要有两步: CMake编译OpenCV源码得到OpenCV.sln工程文件. VS编译OpenCV.sln. 以最新的cmake-3.1 ...
- linux下JUCE源码编译依赖库
JUCE 源码https://github.com/julianstorer/JUCE 想在ubuntu下编译需要提前安装以下依赖库 sudo apt-get install mesa-common- ...
- CMake编译linux C++
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的 ...
- Android开发学习之路--Android Studio cmake编译ffmpeg
最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...
随机推荐
- 区块链--Ubuntu上搭建以太坊私有链
1.搭建私链所需环境 操作系统:ubuntu16.04,开虚拟机的话要至少4G,否则会影响测试挖矿时的速度 软件: geth客户端 Mist和Ethereum Wallet:https://githu ...
- 自定义input文件上传样式
前言 文件上传是我们经常会用到的功能,但是原生的input样式太丑了,能不能自定义一个input文件上传样式呢?我这里写了两种方法,form表单提交跟ajax异步提交都没有问题,自动上传或者点击上传按 ...
- “笨方法”学习Python笔记(2)-VS Code作为文本编辑器以及配置Python调试环境
Visual Studio Code 免费跨平台文本编辑器,插件资源丰富,我把其作为Debug的首选. 下载地址:https://code.visualstudio.com/Download 安装之后 ...
- Jquery操作ul的一些操作笔记
1.html标记 <ul id="attachText"> <li data-text="111"><a href="# ...
- mysql中union 查询
UNION ALL只是简单的将两个结果合并后就返回.这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了. 从效率上说,UNION ALL 要比UNION快很多,所以,如果可 ...
- JavaSE-基础语法(三)-面向对象
面向对象 8.类9.对象10.封装11.继承12.多态13.构造器14.super15.this16.接口17.抽象类18.权限修饰符19.内部类
- Docker 系列三(容器管理).
一.运行容器 1.基于镜像新建一个容器并启动 : tomcat:8.0 -i:交互式操作 -t:终端 -rm:容器退出后随之将其删除,可以避免浪费空间 -p :端口映射 -d :容器在后台运行 指明了 ...
- MySQL指令笔记
-- 双中划线+空格: 单行注释, 与#相同 -- 链接数据库 mysql.exe -h localhost -P3306 -uroot -p -- 查看服务器的对外处理字符集 show variab ...
- [js高手之路]深入浅出webpack教程系列1-安装与基本打包用法和命令参数
[js高手之路]深入浅出webpack教程系列索引目录: [js高手之路]深入浅出webpack教程系列1-安装与基本打包用法和命令参数 [js高手之路]深入浅出webpack教程系列2-配置文件we ...
- angularjs+webapi2 跨域Basic 认证授权(一)
如今的app,利用各种前端框架结合html5的混合开发模式已然盛极一时.其中ionic+angularjs更是如日中天.这种模式利用angularjs $http 请求数据api 以达到前后端分离深得 ...