JNI开发之-CMake方式调用第三方so

news2024/11/28 4:46:19

CMake方式调用第三方so

  • 背景
  • CMake工程配置
    • 工程配置
    • 配置CMakeLists.txt
    • 配置build.gradle
    • 调用第三方so中的方法

背景

最近一个项目是对接自研团队的个so库,因为之前都是用ndk来编译自己的so库,一直没有问题,但是用到这个自研的的so库一直有问题,调用不了里面的方法;原因就是:第三方提供的so库以及头文件都没有没有引入jni.h头文件。所以我们在导入第三方so库以及头文件的时候需要手动的将其关联到自己的so库中,关联成功后就可以在native库中include进第三方头文件,引进头文件成功后就可以在自定义的JNI接口中对第三方头文件中内容进行调用。

所以就尝试用CMake的方式来加载。
建议大家还是用CMake的方式来进行JNI开发,因为CMake是跨平台的构建工具,对JNI开发来说比较明显的优点就是:1,编写c代码有提示;2,自动搜索正在构建的软件可能需要的程序、库和头文件的能力;3,能够为自动生成的文件创建复杂的自定义命令;其他的高级特性可自行搜索;

CMake工程配置

工程配置

1,android studio新建个新工程,不过多说明了;
2,新建java文件testJni.java,随便哪个目录

    private native int sayHello(String text);

生成.h文件,可用参考 JNI生成so,然后把.h文件拷贝到jni(自己创建)目录下,如图:
在这里插入图片描述

新增文件夹,用来存放要导入的第三方so库以及头文件

第三方so库:放在src/main/libs/${ANDROID_ABI}(对应的CPU架构)/你的第三方so库
第三方头文件:放在src/main/jni/你的第三方头文件
如图:
在这里插入图片描述

注意以下几点:
1)libs、CPU对应的架构文件夹(如上图的arm64-v8a)、jin都是我自己创建的;

2)CPU对应的架构文件夹可以根据自己需要来声明,因为提供给我的第三方so库只支持arm64-v8a,所以这里我只创建了arm64-v8a文件夹,通常来说,如果第三方支持什么CPU架构,就创建对应的架构文件夹(armeabi-v7a、arm64-v8a、x86、x84_64),然后把对应的so库放到对应的架构文件夹中;

3)这里的第三方so库以及头文件的存放位置只是我自己的习惯,并不是一定要按我这样放,你可以定义自己的存放路径,但是这个路径你要记住,在后面配置 CMakeLists.txt 中会用到。

配置CMakeLists.txt

app目录下新建空文件CMakeLists.txt
在这里插入图片描述

修改CMakeLists.txt,关联第三方头文件到native so,配置好第三方so库以及头文件导入的路径

#指定CMake构建本地库时所需的最小版本
cmake_minimum_required(VERSION 3.18.1)

# 指定编译出来的so库的存放位置,方便取用给其他开发者,如果指定到jniLibs下需要在build.gradle中配置编译优先解决冲突问题。
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/src/main/libs/${ANDROID_ABI})

set(LIB_DIR "${CMAKE_SOURCE_DIR}/src/main/libs") # 第三方库的存放路径,命名为LIB_DIR,下面会用到

file(GLOB source src/main/jni/testjni.cpp)

add_library( # Sets the name of the library. 将资源文件生成动态链接库(so文件)的库名称(文件名称:“lib" +设置的名称)
        test_jni

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).资源文件(C或C++)的相对位置
        ${source}
        )

target_include_directories(test_jni
        PRIVATE
        ${PROJECT_SOURCE_DIR}/src/main/jni)

add_library(fronted
        SHARED IMPORTED)

set_target_properties(fronted
        PROPERTIES IMPORTED_LOCATION
        ${LIB_DIR}/${ANDROID_ABI}/libfronted.so) # 指定第三方库的位置、链接

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.将所有的add_library中的库链接起来,有多少个add_library成的库就将其添加到这里
        test_jni  #这个和add_library中的指定的so库名称一致
        fronted

        #                        lib-add

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib} )

第三方so名称是libfronted.so,注意make文件中的用法及定义,里面有相应的注释,需要注意的地方如图
在这里插入图片描述
在这里插入图片描述

配置build.gradle

注意是app下的build.gradle

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.zeekr.zeekrmake"
        minSdk 21
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild{
            cmake{
                cppFlags ""// 设置c++标准为默认
                abiFilters "arm64-v8a"
            }
        }
        ndk {// 可以不配置
            moduleName "test_jni" // ndk模块名字
            abiFilters "arm64-v8a"// 不配置的话,默认生成所有平台的so
        }

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    externalNativeBuild{
        cmake{
            // version '3.10.2'
            path "CMakeLists.txt"// 指定CMake文件的位置
        }
    }

    buildFeatures {
        viewBinding true
    }
}

在这里插入图片描述
在这里插入图片描述
配置完成后make project;

调用第三方so中的方法

没有错误,说明配置成功,就可以引入自研so库中的.h文件了,然后调用其中的方法了;
在这里插入图片描述
make project就可用生成so库了,目录在makefile文件中定义有;
在这里插入图片描述

这篇文章就介绍到这里,喜欢的点赞求关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

usbmon+tcpdump+wireshark USB抓包

文章目录usbmon抓包及配合wireshark解析usbmon抓包及配合wireshark解析 usbmon首先编译为内核模块,然后通过modprobe usbmon加载到linux sys文件系统中 rootroot-PC:~# modprobe usbmon​ 而后 linux系统下安装 tcpdump rootroot-PC:~# apt-get install tcpdump​…

如何开发一个好用的公共组件

写在前面 当你对某一个业务场景有自己的理解,想提炼开发了一个很好用的组件,想开放给别的同学使用,或者甚至放在社区给任何一个人使用,你应该会产生以下疑问: 一个标准的组件是怎么样的,在开发过程中有哪…

android-java同步方法和异步方法

接口 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。 两种含义&#xff1a…

中文编程发展不起来,无代码开发能否打个翻身仗

中文编程夹缝里生存众所周知,易语言开创了中文编写程序的先河,最早可追溯到2000年。当时易语言风靡一时,背后积攒了大批的用户,承载着那一代人的青春。也帮助了很多普通的初学者能够在短时间的入门。如今的易语言早已失去了往日的…

大咖说·图书分享|狼书(卷3):Node.js高级技术

Node.js都有哪些需要掌握的高级技术?前端为什么同样需要学习? Node.js未来的发展趋势究竟如何?本期大咖说,Node布道师桑世龙携新作《狼书(卷3):Node.js高级技术》展开分享。 ● 嘉宾介绍 桑世龙:Node布道…

博客系统 SSM 超强硬核良心推荐之第一弹 - 预备工作

硬核 ! 从 0 到 1 完美实现 SSM 版本的博客系统 , 学会保准不吃亏!一 . SSM 版本相比于 Servlet 版本的亮点二 . 初始化数据库三 . 前端页面3.1 注册页面3.2 登录功能3.3 文章总列表页3.4 自己的文章列表页3.5 文章详情页3.6 编写博客页面大家好 , 这是新的专栏 , 博客系统 SSM…

嵌入式Linux学习经典书籍-学完你就是高手

很多刚入门的朋友一直都有人问我要学习资料,嵌入式实在太杂,网上很多人写的太不负责了,本书单综合了本人以及一些朋友多年的经验整理而成。 本人见识和阅读量有限,本书单可能有不对的地方,欢迎朋友指正,交…

SCI写作,一定要避开这些“雷点”!

SCI论文写作中,除了要符合各部分的写作要求,还有许多细节问题需要我们注意,不然可能一不小心就会“踩雷”。 今天我们就来和大家分享SCI各个部分写作时的注意事项。 下面就进入正题! SCI写作注意事项 01 标题的拟定 1.避免使用无…

[Vivado那些事儿]将自定义 IP (HDL)添加到 Vivado 模块设计(Block Design)

绪论使用Vivado Block Design设计解决了项目继承性问题,但是还有个问题,不知道大家有没有遇到,就是新设计的自定义 RTL 文件无法快速的添加到Block Design中,一种方式是通过自定义IP,但是一旦设计的文件有问题就需要重…

短信链接跳转微信小程序

短信链接跳转微信小程序1 实现方案1.1 通过URL Scheme实现1.2 通过URL Link实现1.3 通过云开发静态网站实现2 实现方案对比3 实践 URL Schema 方案3.1 获取微信access_token3.2 获取openlink3.3 H5页面(模拟短信跳转,验证ok)4 问题小节4.1 io…

机器视觉_HALCON_示例实践_1.检测圆形

文章目录一、引言二、检测圆形三、总结一、引言 前面的文(用户指南/快速向导)差不多已经把HALCON的基本内容讲完了,并且在学习过程中还跑过一个简单示例——在单一背景下定位回形针。示例跑过,顿时觉得自己行了,但如果…

当make执行遇到 Arguments too long

1. 问题 Ubuntu20.04上make编译生成so的时候报错: make[1]:execvp:/bin/sh:Arguments too long对应makefile中的报错位置,仅仅是生成so的时候报错,伪代码如下 ${build_tool} -shared -fpic -o "$" ${OBJ_FILE} ${LDFLAGS}然而如…

Linux基础 - NTP时间同步

‍‍🏡博客主页: Passerby_Wang的博客_CSDN博客-系统运维,云计算,Linux基础领域博主 🌐所属专栏:『Linux基础』 🌌上期文章: Linux基础 - DNS服务进阶 📰如觉得博主文章写的不错或对你有所帮助…

IP地址在网络安全行业有哪些应用?

随着我国网络安全法律的颁布实施、制度的细化落实以及标准体系的制定,为我国产业数字化和数字产业化铺平了道路。近几年,数据将对网络安全行业产生巨大影响,包括行业数据的采集、共享,智能算法的演进以及算力资源的复用&#xff0…

ContextCapture Master 倾斜摄影测量实景三维建模技术应用

查看原文>>>https://mp.weixin.qq.com/s?__bizMzAxNzcxMzc5MQ&mid2247582483&idx3&sn38b94b4415ff29531e1619afe0c4df87&chksm9be29c03ac951515c28be526c987b19aedc1a5b3ad98ada5676e8c548f0f229665f495a0f281&token10630879&langzh_CN#rdCo…

Windows 11 绕过 TPM 方法总结,通用无 TPM 镜像下载 (2023 年 1 月更新)

在虚拟机、Mac 电脑和 TPM 不符合要求的旧电脑上安装 Windows 11 的通用方法总结 请访问原文链接:https://sysin.org/blog/windows-11-no-tpm/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 本文要解决的问题…

Qt 不规则窗口,不规则按钮,不规划控件 不规则界面

有一些特殊情况,需要使用不规则窗口或按钮,看起来非常炫酷。 类似: Qt 实现 不规则样式设置,不是视觉欺骗,是真正的不规则 ,点击外面不会触发按钮的点击信号. Part1:不规则窗口 效果&#xf…

【软考——系统架构师】信息系统基础

🔎这里是【软考——系统架构师】,关注我考试轻松过线 👍如果对你有帮助,给博主一个免费的点赞以示鼓励 欢迎各位🔎点赞👍评论收藏⭐️ 文章目录👀一、信息化概述👀二、信息系统工程总…

json-server环境搭建及使用

json-server环境搭建 一个在前端本地运行,可以存储json数据的server。 基于node环境,可以指定一个 json 文件作为 API 的数据源。 文章目录json-server环境搭建前提下载安装监听服务启动成功修改端口号方式一:方式二:数据操作测试…

[Datawhale][CS224W]图机器学习(二)

文章目录一、概述1.1 图的结构1.2 特征处理1.3 学习任务1.3.1 节点分类1.3.2 链接预测1.3.3 图级任务二、传统方法三、统计特征与核方法3.1 节点层面3.2 连接层面3.3 图层面3.4 节点袋参考文献Datawhale开源学习社区 x 同济子豪兄 Stanford课程中文精讲系列笔记本文同时发布在&…