cmake android-ndk google demo- https://github.com/googlesamples/android-ndk

在Android Studio中使用C/C++库有两种方式:cmake和ndk-build。cmake是最新支持的方法,通过配置CMakeLists.txt文件来实现;ndk-build是传统的方式,通过配置Android.mk文件来实现。
  Cmake是跨平台的一个编译配置工具,android studio 2.2之后就开始支持这个cmake工具了,之前Android studio开发c++都是利用NDK的方式,也就是Android.mk + Application.mk + soucre.cpp的构建方式,然后在gradle构建工具下执行一条命令生成c++ so库并打包进去;而cmake则是 CMakeLists.txt + source.cpp 的形式。

Android Studio 2.2 之后你有2种选择来编译你写的 c/c++ 代码。一个是 ndk-build + Android.mk + Application.mk 组合,另一个是 CMake + CMakeLists.txt 组合。这2个组合与Android代码和c/c++代码无关,只是不同的构建脚本和构建命令。

JNI(Java Native Interface),NDK(Native Development Kit),ABI(Application binary interface)。

Android SO文件的兼容和适配- http://blog.coderclock.com/2017/05/07/android/Android-so-files-compatibility-and-adaptation/?ref=myread

-- A C++ library for interacting with JSON- https://github.com/open-source-parsers/jsoncpp
 底层(C++)那里给过来的有可能是.a静态库,也有可能是.so动态库,然后如何集成进项目里,.a是怎么构建出来的,a和
so的区别又是什么?在Android中使用CMake常遇的问题,解决方法是什么。
#include<jni.h>

#define XONGFUNC(name)Java_com_xong_andcmake_jni_##name
extern "C" JNIEXPORT
jstring JNICALL

XONGFUNC(NativeFun_stringFromJNI)(JNIEnv *env, jclass thiz)

  return env->NewStringUTF("Hello,I from C++");

}

用Cmake的方式构建a静态库,so动态库,且集成到项目中- https://github.com/lilinxiong/UseCmakeBuildLib
libcode: 以源码的形式将SDK依赖到cpp中使用
libsosimple: 构建hello简单的.so动态库,且将.so和所需头文件导出到 project/export/libsohello 目录中
libsojsoncpp: 构建jsoncpp的.so动态库,且将.so和所需头文件导出到 project/export/libsojsoncpp 目录中
libasimple: 构建一个hello简单的.a静态库,且将.a和所需头文件导出到 project/export/libahello 目录中
libajsoncpp: 构建jsoncpp的.a静态库,且将.a和所需头文件导出到 project/export/libajsoncpp 目录中

Android导入第三方静态库.a,编译成动态库.so。

> CMake编译SO库

CMake是一个工程文件生成工具。用户可以使用预定义好的CMake脚本。CMake的CMakeList.txt文件从Linux平台跨到Windows平台。

cmake官方文档(http://www.cmake.org/),cmake 实践

AndroidStudio之NDK开发CMake CMakeLists.txt编写入门-https://blog.csdn.net/tabactivity/article/details/78364296

Android Studio 下Cmake的CMakeLists.txt文件配置(生成多.so模式)- https://blog.csdn.net/u012149399/article/details/79164263
Android studio中NDK开发(一):CMakeLists.txt编写入门- https://blog.csdn.net/liopo/article/details/77686563

Cmake实践- https://blog.csdn.net/xyz599/article/details/53606149

在linux 下进行开发很多人选择编写makefile 文件进行项目环境搭建,而makefile 文件依赖关系复杂,工作量很大
 采用自动化的项目构建工具cmake 可以将程序员从复杂的makefile 文件中解脱出来。cmake 根据内置的规则和语法来自动生成相关的 makefile 文件进行编译,同时还支持静态库和动态库的构建。

cmake 要求工程主目录和所有存放源代码子目录下都要编写CMakeLists.txt 文件,注意大小写(cm 大写,list中l 大写且落下s).
#cmake file for project association                     #表示注释   
      #author:>---double__song  
      #created:>--2011/03/01  
  
      CMAKE_MINIMUM_REQUIRED(VERSION 2.8)    #cmake 最低版本要求,低于2.6 构建过程会被终止。   
  
      PROJECT(server_project)                          #定义工程名称  
  
      MESSAGE(STATUS "Project: SERVER")               #打印相关消息消息   
      MESSAGE(STATUS "Project Directory: ${PROJECT_SOURCE_DIR}")  
      SET(CMAKE_BUILE_TYPE DEBUG)                      #指定编译类型  
      SET(CMAKE_C_FLAGS_DEBUG "-g -Wall")          #指定编译器   
        
      ADD_SUBDIRECTORY(utility)                              #添加子目录

ADD_SUBDIRECTORY(server)

---------------------------------

Android CMake生成简单so文件:

CMake生成多个.so文件- https://blog.csdn.net/liu_qin_bin/article/details/78108262

1.编写带有Native方法的Java 文件;

2.使用Studio的Terminal控制台,切到app/src/main/java,使用javah -jni *(App包名).native_method(包).Caculate(Java类),生成.h文件;javah -jni com.desaco.practiceknowing.native_method.NativeEncryptDecode

3.将.h文件拷贝到cpp文件夹下,编写.h对应的.cpp文件

4.配置App Gradle文件

android {compileSdkVersion 25buildToolsVersion '26.0.2'defaultConfig {applicationId "com.desaco.practiceknowing"minSdkVersion 18targetSdkVersion 25versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"externalNativeBuild {cmake {cppFlags "-frtti -fexceptions"}}ndk {abiFilters "armeabi", "x86"}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}externalNativeBuild {cmake {path "CMakeLists.txt"}}sourceSets.main {jniLibs.srcDirs = ['libs']jni.srcDirs = []}
}

5.配置CMakeLists文件

cmake_minimum_required(VERSION 3.4.1)
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})

#这个时候会生成你的.so,不过你不能去clean project,因为你会让你的工程apk的.so被清除。

# 编译出一个动态库 native-lib,源文件只有 src/main/cpp/native-lib.cpp
add_library( # Sets the name of the library.caculate-lib# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).src/main/cpp/Caculate.cpp )# 找到预编译库 log_lib 并link到我们的动态库 native-lib中
find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log )target_link_libraries( # Specifies the target library.caculate-lib# Links the target library to the log library# included in the NDK.${log-lib} )

6.build - Make Project,即在app/build/intermediates/cmake/路径下;如果没有配置路径的话

Cmake + CMakeLists.txt 编译SO库(JNI编译)相关推荐

  1. cmake,CMakeLists.txt,make,makefile的关系

    cmake的作用:生成makefile的工具.读入源文件之后,自动生成makefile CMakeLists.txt的作用:告诉cmake,如何生成makefile makefile的作用:设置编译规 ...

  2. CMakeLists.txt使用boost库

    1.实例代码example.cpp #include <boost/regex.hpp> #include <iostream> #include <string> ...

  3. cmake CMakeLists.txt 命令 add_compile_options、add_definitions、target_compile_definitions、build_command

    add_compile_options() 增加源文件的编译选项. add_compile_options(<option> ...) 为当前路径和下层路径的目标增加编译器命令行选项,选项 ...

  4. cmake导入so库_cmake编译.so库体积非常大,求解答

    最近用cmake替代ndk-build编译so库,编译出来的so库打出很多,ndk-build编译的400k左右,cmake编译出的达到4.5M. Gradle插件的版本是:gradle:3.0.0, ...

  5. 【CMake】CMakeLists.txt的超傻瓜手把手教程(附实例源码)

    新手写CMakeLists.txt简直就是实力劝退,各种命令让很多人头大,如何写一个最基础的CMakeLists.txt呢?本文从一个实例出发,教你编写的基本流程. CMakeLists.txt的基本 ...

  6. GCC,Clang,make,cmake,makefile,CMakeLists.txt的概念

    gcc和clang gcc和clang是两个不同的编译器 make和cmake make和cmake是搭配编译器来方便用户进行多文件编译而发明的工具 makefile make工具相当于一个智能的批处 ...

  7. 最新版FFmpeg移植Android:编译so库(基于NDK r20和FFmpeg-4.1.0)

    FFmpeg是非常强大的编解码库,支持相当多的格式.如果你仔细看一下手机中各种播放器的许可条款,一定不会缺少FFmpeg的身影. 但是网络上FFmpeg移植的资料都非常少,很多还是使用很老的库,比如使 ...

  8. 在Windows下使用vs2019编译libjpeg库

    一.库的编译 1.下载 libjpeg 源码,这里我下载的是 jpegsr9e.zip 2.解压源码 3.进入解压后的目录,找到 makefile.vs 文件,用文本编辑器打开并编辑,找到 语句 #! ...

  9. 用于创建此对象的程序是package_【ROS 学习笔记】CMakeLists.txt 与 package.xml

    0. 前言 在 ROS 中,节点的编写语言通常只有 C++ 和 Python,C++ 需要编译后才能运行,Python 则无需编译. 我们知道 Linux 平台编译 C++ 文件,需要编译器和链接器, ...

最新文章

  1. 如何利用C#开发“扫雷”小游戏
  2. php网址中mod=,php – Apache mod-rewrite htaccess – 带参数的动态url
  3. JavaScript快速入门-ECMAScript本地对象(RexExp)
  4. linux日志发送,Linux中将执行过的命令记录到日志并发送到服务器的方法
  5. 如何找出nginx配置文件的所在位置?
  6. 继承jpanel不显示_房产继承全指南
  7. Vue+Openlayers实现显示图片并分优先级多图层加载
  8. 如何判断数据背离正态分布?
  9. js将long日期格式转换为标准日期格式
  10. 总结windows下堆溢出的三种利用方式
  11. 每天学一点Linux(一)——apt-get
  12. 如何用cool edit剪辑拼接音频文件
  13. 《HTTP 权威指南》—— 连接管理
  14. Linux下报ora-12162,ORA-12162: TNS:net service name is incorrectly specified
  15. java+rabbitMQ实现一对一聊天
  16. python提取cad坐标_教你一个CAD坐标提取的小技巧
  17. endnote没有加载项_word中手动添加endnote的加载项
  18. 初中数学结合计算机教学设计,初中数学课教学设计与信息技术的有效整合-精选教育文档...
  19. python文本处理尝试
  20. 超星浏览器4.0漏洞0day Exp

热门文章

  1. 基于windows server 2012 的微软桌面虚拟化实战教程
  2. datareader(Datareader对象的什么方法用于从查询结果中读取行)
  3. 360手机刷机 360手机Magisk面具安装与使用教程
  4. 傻瓜教学——什么是数组?数组的概念又是什么?
  5. BEC3 考试当天记录及感悟
  6. PID控制算法实践应用(二):位置式PID控制算法的C语言实现
  7. 不见液晶电视不上轿的新娘,新郎愤而转身娶旧爱
  8. tableView搜索功能
  9. SVG和VRML简介
  10. ObjectArx块操作封装