使用Cmake编译原生代码生成对应SO,以OpenCV为例

一、前期基础知识储备

首先 利用AS创建含原生代码的项目时,它本身都编译不过,是的编译不过,报的错就是下面这个。

报错:CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.

解决方法:手动控制,只使用3.6版本的Cmake,弃用3.10版本的,如下图:

分析Cmake的项目结构

Android笔记之使用CMake进行JNI开发(Android Studio)

android studio 使用CMAKE

以上两文,足够初学者掌握Cmake的基础构建了。(谢谢博主的分享!)

 

多个原生代码进行编译SO库

AndroidStudio使用CMakeLists.txt编译多个so库

Android Studio CMake 生成多个so

实际开发中,会碰见一种场景:需要使用多份原生代码编译各自对应的SO库,以上两文,涵盖非常全面。(谢谢博主的分享!)

 

Cmake的详细配置

Android CMake配置篇

Cmake有自己的一套语法规则,上文涵盖了主流配置的信息,可以借鉴使用。

如果不能满足,可以参考Cmake的官方文档,或者Cmake的中文手册。(谢谢博主的分享!)

 

大杂烩,大量内容

关于在Android中使用CMake你所需要了解的一切 

此篇文章非常重要,博主就是从这篇得到启示,在链接So库代码时,是可以将不同的资源进行拼接处理的。(谢谢博主的分享!)

博主面临的开发问题是利用多份原生代码生成SO库,不同于上面的多生成,博主的需求是只生成一份SO库。

 

使用Cmake编译OpenCV库

Android基于CMake进行OpenCV开发配置

Android NDK学习笔记:Android Studio3.1+CMAKE+OpenCV3.4配置

博主面临的另一开发问题,是多份原生代码都使用到了OpenCV的代码,所以需要将OpenCV链接进SO库,以上两篇文章给予很大帮助。(谢谢博主的分享!)

 

二、上代码,具体实现

博主的实现是基于上述文章的综合,如果确实有类似的需求,建议看一遍链接里的文章,确实很好。

1)博主OpenCV目录和libopencv_java3的SO库位置,对于写入CmakeLists配置文件此信息至关重要,如下:

2)博主需要arm架构32位和64位的apk,所以取用两个libopencv_java3的SO库,如下:

3)如上文中所述,博主需要将多份原生代码连同OpenCV一起编译为一个SO库,以下是原生代码信息:

如图所示,原生代码含有不同格式,需要连同OpenCV一起整合。

4)以下是项目中使用到的CmakeLists文件,如下:

cmake_minimum_required(VERSION 3.4.1)


#支持-std=gnu++11
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

#设置opencv的sdk目录,/Users/henry/Downloads/OpenCV-android-sdk替换成个人在opencv官网下载到本地的sdk路径
set(pathToOpenCv D:/adt-bundle-windows-x86-20140702/sdk/OpenCV-3.0.0-android-sdk/OpenCV-android-sdk)#set指令自定义变量
#配置加载native依赖(头文件)
include_directories(${pathToOpenCv}/sdk/native/jni/include)#
#include_directories(${pathToOpenCv}/sdk/native/jni/include)

add_library(lib_opencv STATIC IMPORTED)

#设置了OpenCV的动态链接库的路径 引入libopencv_java4.so文件
set_target_properties(lib_opencv
                      PROPERTIES
                      IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)

#add_library表示添加一个库,native-lib是库名,cmake将其打包成libnative-lib.so文件
add_library(cmake_filters-lib
            SHARED
            src/main/cpp/filters.h
            src/main/cpp/filters.cpp
            src/main/cpp/jni_part.cpp)#将cpp文件编译成libnative-lib.so共享对象,第二个参数SHARED就是共享的意思



#最后将opencv静态库链接进native-lib中 这里我们把libopencv_java3和log链接到了native-lib上
target_link_libraries( # Specifies the target library.
        cmake_filters-lib#打包进apk的库
        ${log-lib}
        lib_opencv#添加opencv库
        )

接下来指出几个关键的地方:

5)做完以上几个步骤,然后在build.gradle中进行ABI架构过滤,就可以正常编译和进行打包测试,如下:

可以看到,编译后,在debug和release文件夹下都生成了指定架构的SO库。编译成功。

以上,就是全文内容,建议开发者先看完几篇推荐的文章,在结合博主给出的配置信息,然后试着编译自己的SO库。

PS:使用Cmake确实比使用NDK要方便更多,学习成本也不算高。

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值