Android开发调用C++算法库完全指南(亲测可用)

在Android Studio中调用C++程序 一、在安卓中创建C++原生代码 1.file -> new project -> native C++ :然后一切选择默认; 列子项目名称为Mytest1,创建成功如下图:点击红圈部分 2.进入到下面的界面勾选NDK、CMake(有LLDB的,也可以勾选,没有就算了),若为Not installed,直接在这里下载就好,下载好了,点击apply,ok,status栏其为installed即可 点击project 3.打开native-lib.cpp 将下图红线部分修改为下图的代码即 阅读详情

实际项目中的算法库很多是C++代码编写的,算法工程师经常面对的一个问题是算法的跨平台调用,比如算法工程师在平常工作中是基于C++代码进行算法开发的,公司开发一款android系统的应用程序,需要调用C++算法库,如何调用?解决这类问题的核心思想是:(一)跨平台编译工具CMake,即只需要一次编写算法代码,就可以在多个平台生成对应的算法库;(二)Android开发是基于java语言而算法库是C++代码实现的,我们面对的另一个问题是在android开发中用java语言调用C语言算法接口,不同语言有不同的书写规范,这当然是不可能编译成功的,因此我们需要通过中间层(JNI编程)来搭建java语言和C语言沟通的桥梁,本文就通过android系统调用C++算法库来阐述算法库的跨平台调用思想(文末附完整代码链接)。


目的:Android开发调用C++算法库(数组求和算法)

Android集成开发工具:Android Studio3.10.2

跨平台编译工具:CMake3.4.1


1. 新建使用JNI编程的工程


1)File -> New -> Project,勾选native C++,表示项目中可使用C语言进行编码。


640?wx_fmt=png


2)设置项目和包的名称:


640?wx_fmt=png

在向导的Customize C++ Support部分,选择默认的Toolchain Default。


640?wx_fmt=png


2. 下载JNI开发所需的NDK,LLDB,CMake工具包


1) 打开Android studio -> Preferences -> Android SDK;

2) 在SKD标签中选择LLDB,NDK,CMake工具包进行下载;


640?wx_fmt=png


JNI:Java Native Interface(Java本地编程接口),一套编程规范,它提供了若干的API,实现了Java和其他语言的通信(主要是C/C++)。


NDK:Native Development Kit(本地开发工具),一系列工具的集合,这套工具允许你在Android开发中使用C和C++代码。


CMake:跨平台编译工具。


LLDB:一种调试程序,ANDROID STUDIO使用它来调试原生代码。


3. 切换到project选项,在目录 jniarray/app/src/main/java的Mainactivity.java中写求向量求和算法的接口函数:


640?wx_fmt=png


我们只声明了接口函数并无实现,因此接口函数显示红色的。


同时按option键+enter键,选择create function Java_com_zl_jniarray_MainActivity_sumArray并按Enter键,在nativa-lib.cpp生成该接口函数的实现体:


640?wx_fmt=png


下面编码该接口函数的实现:


640?wx_fmt=png


细心的读者会发现该接口函数的实现与cpp并不完全相同,如jint表示整型变量,jintArray表示整形数组,因为接口函数是通过JNI编码实现的,JNI与java语言和C语言都能进行交互。


我们完成了接口函数的实现后,用CMake进行编译,生成Android开发所需要的算法库,CMakeList.txt文件是指定CMake的编译规则,下面解释下该项目的编译规则:


640?wx_fmt=png


4 .点击项目构建按钮


640?wx_fmt=png


默认生成的库路径为:app/build/intermediates/cmake/debug/obj/


640?wx_fmt=png


实际开发中需要release模式下的算法库,我们在Android Studio左下角点击Build Variants标签并选择Release-x86,再次重新构建生成release模式下的动态库:


640?wx_fmt=png

生成release模式下的动态库:

640?wx_fmt=png


5. jar包的生成


Android开发以.so库和jar包的形式调用算法库,我们已经生成了debug和release模式下的.so动态库,下面介绍如何生成jar包。


切换为Android选项:


640?wx_fmt=png

新建模块module,选择Android Library


640?wx_fmt=png


点击下一步,设置module的包名应和app的包名相一致:


640?wx_fmt=png

在目录com.zl.jniarray新建java类,该类名与app的类名相同,声明接口函数,并下载算法库:

640?wx_fmt=png

640?wx_fmt=png


在jniarray中的build.gradle文件添加下面语句,目的是设置保存jar文件的路径和重新命名jar文件:

640?wx_fmt=png


重新编译,切换目录为jniArray文件夹,使用如下命令./gradlew makeJar重新命名jar文件。

因此,我们在jniarray/build/libs文件夹生成jni-array的jar包。

640?wx_fmt=png

6. 算法测试


新建工程,选择empty activity,其他选项默认,点击Finish。


640?wx_fmt=png


在目录MyApplication2/app/lib文件夹添加算法.so库和jar包:


640?wx_fmt=png

添加jar包到该项目中,右键jni-array,点击Add As Library。


640?wx_fmt=png


则会在app的gradle文件中自动添加下面的语句:


640?wx_fmt=png


在app的gradle文件中添加搜寻动态.so库的路径:

640?wx_fmt=png


我们在com.zl.myapplication包中的MainActivity1.java中成功调用了C++算法库。


6. 后续说明


这只是一个简单的Android开发调用C++库的例子,实际项目的算法远远比这个复杂,但是思想其实是不变的,因为我们有了CMake这个强大的工具,只要我们写了算法的cpp文件,然后复制粘贴到cpp和header文件夹内,写好你的CMakelist配置文件,就能生成跨平台库了,当然,项目自带的非算法cpp文件包含了JNI编程,它是沟通算法库与java语言的桥梁,我们用java语言调用JNI编程的接口函数,然后JNI调用C++算法,JNI也成为中间层。


调用流程:

640?wx_fmt=png


JNI编程最大的难点之一是类型的转换和方法的调用,这里我就不展开了,若有问题的话可以私信小编。


如下图的项目算法的文件说明,红色框的文件是我已经写好的算法文件,蓝色框是JNI编程,算法文件复制粘贴到cpp文件夹即可,我只需要写蓝色框文件的接口函数,目标是实现java语言调用C++代码的算法库。


640?wx_fmt=png

7. 小结


文章通过简单的例子说明了java语言调用c++库的过程,这种跨平台调用算法库的思想是算法工程应掌握的,希望这篇文章能够帮到你。

完整代码链接:

github:https://github.com/zhangleiszu/Android-C-


欢迎扫码关注:

640?wx_fmt=other




Android 使用C++实现一个程序,需要实现如下的功能 / 处理帧数据 processFrame(frame);1.调用mediaCodec实现硬件解码。2.通过GPU运算把解码后的每一帧数据格式转化为RGB格式,并放入缓存池。3.设计一个一个接口从缓存池按帧获取数据。由于该问题需要大量的代码实现,我们无法提供完整代码。2.通过GPU运算把解码后的每一帧数据格式转化为RGB格式,并放入缓存池。3.设计一个接口从缓存池按帧获取数据。 阅读详情

相关推荐

EUI-NEO:纯C++跨平台GUI框架开发实践与安卓部署指南

跨平台GUI开发是现代软件工程的核心需求,通过抽象层技术实现一套代码多平台编译。其原理是基于统一的API接口和渲染引擎,在不同操作系统上适配原生图形系统。这种架构的技术价值在于显著降低维护成本,提升代码复用率,同时保持C++的高性能特性。在移动应用、嵌入式界面、桌面工具等场景中,跨平台框架能够快速实现产品落地。EUI-NEO作为新兴的C++跨平台解决方案,采用纯C++技术栈,支持Windows、macOS、Linux、Android和iOS等多平台部署,特别在安卓端通过NDK工具链实现原生性能。该框架避免了

weixin_33853827的博客 513

Android 编译C++

在开发过程中,有一些底层库,算法、加解密之类的功能,不是用Java写的,而是C或者C++,而我们需要在Android工程中调用C/C++的函数达到理想的要求,那么这个时候你就需要知道怎么使用它们。

晨曦 7465

windows+cmake+vscode+NDK远程调试安卓端C++项目

使用NDK编译代码时,需要编写.mk脚本进行代码的编译和链接,比较繁琐,因此可以借助cmake和NDK工具链组织项目,只需要在根目录的CMakeLists.txt中调用NDK工具链就可以进行交叉编译,无需学习NDK编译脚本的语法,并且仍然可以发挥cmake 的特长。在这片文章中,我们不介绍如何使用cmake+NDK进行交叉编译,认为读者已经有这方面的基础。本文主要介绍如何使用NDK的调试工具,在windows上调试C++项目,而C++项目实际是在安卓手机上运行的。脚本中的路径自行替换。

qq7835144的博客 795

在 Android 中使用 C/C++:初学者综合指南

作为一名 Android 开发人员,我们都一直在使用 Java 或 Kotlin 来构建漂亮的 UI 和功能。整个 Android 堆栈,从应用程序开发到应用程序执行,都围绕 JVM 和 Java*风格的*功能,不包括用 C 编写的内核(Linux 内核)。

特立独行的博客 9813

UniApp Android插件调用C++ so库:JNI实战与性能优化指南

在移动应用开发中,当JavaScript或Java/Kotlin无法满足密集计算、硬件加速或复用现有C/C++库的需求时,调用原生代码成为关键技术方案。其核心原理是通过JNI(Java Native Interface)建立Java与C/C++之间的通信桥梁,实现跨语言函数调用与数据交换。这项技术的核心价值在于突破性能瓶颈,直接利用底层硬件能力与成熟算法库,例如集成OpenCV进行图像识别或调用FFmpeg处理音视频。在UniApp这类跨端框架中,通过Android原生插件集成JNI,能够将C++的高性能模

weixin_29171087的博客 261

Android调用C++函数

Android调用C++函数

510

android sudio jni 调用so_Android开发调用C++算法库完全指南(亲测可用)

实际项目中的算法库很多是C++代码编写的,算法工程师经常面对的一个问题是算法的跨平台调用,比如算法工程师在平常工作中是基于C++代码进行算法开发的,公司开发一款android系统的应用程序,需要调用C++算法库,如何调用?解决这类问题的核心思想是:(一)跨平台编译工具CMake,即只需要一次编写算法代码,就可以在多个平台生成对应的算法库;(二)Android开发是基于java语言而算法库...

weixin_39753674的博客 353

Android 三方算法库导入及使用

Android studio 三方算法导入使用教程

LiggerBill的博客 1195

添加库文件_Android开发调用C++算法库完全指南(亲测可用)

实际项目中的算法库很多是C++代码编写的,算法工程师经常面对的一个问题是算法的跨平台调用,比如算法工程师在平常工作中是基于C++代码进行算法开发的,公司开发一款android系统的应用程序,需要调用C++算法库,如何调用?解决这类问题的核心思想是:(一)跨平台编译工具CMake,即只需要一次编写算法代码,就可以在多个平台生成对应的算法库;(二)Android开发是基于java语言而算法库...

weixin_33229152的博客 693

VMvare 桥接模式无法联网、没有未桥接的主机网络适配器,无法将网络更改为桥接状态。

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!战项目源码讲义》点击传送门即可获取!**

q16974058的博客 4333

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com

很多情况下是没有现成的VS Code Server程序的,需要手动下载。记住上面的Commit ID,可以通过下面的链接下载 vscode-server-linux-x64.tar.gz。然后将vscode-server-linux-x64.tar.gz上传在服务器上的$HOME/.vscode-server/bin文件夹中,解压。在wsl中下载不了 vscode 的核心。运行下面两行命令,建立空的$HOME/.vscode-server/bin文件夹。重新运行 wsl与vs的链接即可。

点云算法工程师 3793

终极篇 C++算法到安卓的移植——AS调用VS的so库

目的:windows平台下的c++算法,需要移植到安卓系统上。平时用惯了Visual Studio,再在其他软件上重新写算法,调试算法,实在头疼。所以我用VS的c++移动开发功能创建动态共享库,将算法内容放入,并实现JNI和JAVA接口部分;最后用Android Studio调用成功。 吐槽微软的仿真器以及VS自带的google emulator for android,搞了很久,还是有问...

Merria28的专栏 4865

单细胞测序数据读取实战指南:从入门到精通

本文提供了单细胞测序数据读取的实战指南,涵盖从标准10X Genomics格式到通用表达矩阵及RDS文件的读取方法。文章重点解析了数据读取的核心步骤、常见问题解决方案及进阶技巧,旨在帮助用户夯实数据分析基础,确保后续分析流程的准确性。

weixin_29095587的博客 460

android 软件调用c库,Android调用第三方C++算法库

背景现在越来越多应用包含一些第三方C/C++算法库, 比如图像处理, 人脸检测, 语音识别等等. 第三方提供的算法库都是C/C++动态库(.so), 不同的提供商提供的接口存在差异, 主要分为以下两种:提供Java接口和so库这种类型调用很简单, 把so库放到打包到apk或者Android系统中, 通过Java接口调用即可, JNI部分代码提供商都写好了.只提供C/C++接口和so库此类型调用稍微...

weixin_39785165的博客 1117

【Qt串口调试助手】1.1 - Qt5编写串口调试助手,Qt串口编程

这章来学习串口数据流操作。仿照成品制作一个自己用Qt编写的串口助手。 1. 布局UI界面 创建QWidget工程,布局UI界面:拖入2个 Plain Text Edit,作为串口数据的接收显示和发送框。 拖入几个 Combo Box 、Label 和 Push Button,使用两个Widget进行布局。如下所示。 将接收区的 Plain Text Edit,属性勾选上 readOnly,使其运行时不会被人为的输入操作影响。 加入一些弹簧,使布局美观。(有必要可以加设置不能调整..

Mark_md的博客 9277

RKNN3588——YOLOv8的PT模型转RKNN模型

1. 首先克隆rknn修改后的ultralytics版本项目到本地主要是修改了源码的ultralytics/nn/modules/head.py和ultralytics/engine/exporter.py两个文件。2. 使用修改后的ultralytics对pt模型进行模型转换,此处的format=rknn代表支持rknn后续的转换,而不是用onnx,一定要注意!!!

张飞飞的博客 7182

UniApp调用C++ so库:Android原生插件开发实战指南

在移动应用开发中,跨平台框架与原生性能的结合是提升应用能力的关键。通过JNI(Java Native Interface)技术,可以实现Java/Kotlin代码与C/C++原生代码的高效交互,从而突破JavaScript引擎的性能瓶颈,直接调用底层硬件加速或经过深度优化的算法库。这种技术方案的核心价值在于,它允许开发者在不放弃跨平台开发效率的前提下,为应用注入“硬核”的**高性能计算**和**硬件交互**能力。典型的应用场景包括集成第三方的人脸识别、音视频编解码、工业视觉分析或金融加密等C++算法库。本文

weixin_29174141的博客 337

基于 YOLOv26 的高速抛物识别系统:微小目标检测

本文提出了一种基于YOLOv26的高速抛物识别系统,专注于微小目标检测。系统采用多模块协同架构,包括视频预处理、YOLOv26检测、目标跟踪和抛物行为分析等模块。关键技术包括YOLOv26s模型检测、DeepSORT目标跟踪和边缘计算部署。通过构建包含多种抛物类型的专业数据集,并应用数据增强技术提升模型性能。系统实现了车辆检测、微小抛物目标识别、抛物轨迹分析和风险等级评估等功能,可实时检测高速公路上的抛物行为并触发告警,为交通管理提供智能化解决方案。

一键难忘的博客 635

C++项目工程(包含opencv库以及项目的依赖库移植)编译成android可以使用的so库并在Android studio上调用so库进行使用(血泪操作总结)

C++项目工程(包含opencv库以及项目的依赖库移植)编译成android可以使用的so库并在Android studio上调用so库进行使用(血泪操作总结)

ccjjjjdff的博客 7374

爆破shadow文件密码脚本(完成版)

由于添加了一个for循环,再稍作修改,让password not found!print(f"Trying password:")显示爆破的密码和过程。将代码中的password="123456"替换成下面代码。line.strip()函数首尾去空格。

m0_56578216的博客 772

泛微OA集成阿里云短信(E9保姆教程)

泛微OA集成阿里云短信(E9保姆教程)

技术分享 517

Android JNI编程笔记--从入门到上手

实际项目中的算法库很多事C++代码编写的,算法工程师经常面对的一个问题就是算法的跨平台调用,比如算法工程师在平常工作中事基于C++代码进行算法开发的,而公司开发一款Android系统的应用程序,需要调用C++算法库,如何调用成为了一个很重要的的问题。

u014291571的博客 1130

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

使用C++开发Android .so库的优势与实践指南

使用C++开发Android .so库的优势与实践指南

zhangyihu321的专栏 971

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

安卓中的jni调用

背景 1、JNI: Java Native Interface。是一套编程接口,用来实现Java代码与本地的C/C++代码进行交互 2、用途: 可以通过JNI调用系统提供的api,因为操作系统或者抵触硬件驱动几乎都是c/c++写的。Java和C/C++不同 ,它不会直接编译成平台机器码,而是编译成虚拟机可以运行的Java字节码的.class文件,通过JIT技术即时编译成本地机器码,...

调上调下的女生 1402

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

windows环境下生成 Android 可执行程序/算法库

windows环境下生成 Android 可执行程序/算法库前言一、MinGW和NDK工具安装和环境配置二、生成Android可执行程序/库1.Android.mk 和Application.mk脚本配置2.ndk-build编库三、调试ADB工具,在Android平台运行1.ADB工具安装2.windows连接Android平台,运行 前言 交叉编译的应用场景: 例如:neon优化硬仿一致性验证等。 一、MinGW和NDK工具安装和环境配置 在讲MinGW和NDK之前,我们先要了解一下如何在lin..

wsy1234567890的博客 2643
上一篇: 一文让你完全入门EM算法
下一篇: 企业难寻AI人才,求职者就业难,如何破局?
机器学习算法那些事
博客等级 码龄9年 1633粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值