Android NDK集成OpenCV使用C++的.h和.so库函数

news2024/12/24 10:07:54

Android NDK集成OpenCV使用C++的.h和.so库函数

opencv可以作为一个单独的Android module库,被工程下的其他模块使用,但是这样就没法在Android NDK项目的c++代码直接使用opencv的.h文件和.so文件。要在Android NDK项目C++代码文件中使用,则需要以Android NDK C/C++方式集成opencv。

(1)为当前module创建一个Android NDK的c++模块,参考:

Android添加C++/CPP项目代码(2)_zhangphil的博客-CSDN博客基于Windows平台,Android NDK(JNI)开发技术》【摘要】本文介绍如何基于Windows平台,在Eclipse中使用Android NDK技术实现“Android平台上的JNI ( Java Native Interface ) ”开发。新增的getStringCpp()是新增的一个方法,因为没有实现所以报红。以上完成后,就可以在Java层像使用普通Java函数一样使用getStringCpp()其中,loadLibrary()里面填写的即是(2)里面的xxx.cpp的xxx名字。https://blog.csdn.net/zhangphil/article/details/130207425

 

(2)下载opencv提供的Android SDK。基于opencv-4.7.0。

Releases - OpenCVhttps://opencv.org/releases/下载后的sdk解压。

本例只考虑arm64-v8a,把目录opencv-4.7.0-android-sdk\OpenCV-android-sdk\sdk\native\libs\arm64-v8a 下面的 libopencv_java4.so 放入到 (1)中的cpp目录下的的jniLibs目录里面(jniLibs可以自己手动创建),在app的build.gradle配置文件android - defaultConfig块里面增加配置:

        ndk {
            abiFilters 'arm64-v8a'
        }

        externalNativeBuild {
            cmake {
                cppFlags ''
                arguments "-DANDROID_STL=c++_shared"
            }
        }

 

把opencv-4.7.0-android-sdk\OpenCV-android-sdk\sdk\native\jni\include下面C++定义的头文件目录 opencv2 全部连文件夹复制到cpp的目录下,形成这样的代码结构:

60e0bfa045cb449bbb000f6f5590b441.png

 

 

 

(3)修改CMakeLists.txt。(重要,且容易出错)

cmake_minimum_required(VERSION 3.22.1)

project("opencv")

# 指定一个本地头文件路径。
include_directories(${CMAKE_SOURCE_DIR}/)


add_library( # Sets the name of the library.
        opencv

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        opencv.cpp)


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)


# 设置opencv的动态库
add_library(libopencv_java4
        SHARED
        IMPORTED)
set_target_properties(libopencv_java4
        PROPERTIES
        IMPORTED_LOCATION
        ${CMAKE_HOME_DIRECTORY}/jniLibs/${ANDROID_ABI}/libopencv_java4.so
        )


target_link_libraries( # Specifies the target library.
        opencv

        libopencv_java4

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

 

(4)创建Android的Java层函数调用opencv的C/C++ native函数:

package my.opencv;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("opencv");
    }

    public native String myOpenCv();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("fly-Android", myOpenCv());
    }
}

 

(5)myOpenCV对应在native层的C/C++实现,在opencv.cpp里面:

#include <jni.h>
#include <stdlib.h>
#include <string>
#include <android/log.h>
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/types_c.h"
#include "opencv2/opencv_modules.hpp"

const char *TAG = "fly-native";

#define LOG __android_log_print

void LOGI(const char *info, std::string s) {
    LOG(ANDROID_LOG_INFO, TAG, info, s.c_str());
}

void LOGI(const char *info, int num) {
    LOGI(info, std::to_string(num));
}

using namespace cv;

extern "C"
JNIEXPORT jstring JNICALL
Java_my_opencv_MainActivity_myOpenCv(JNIEnv *env, jobject thiz) {
    int v_major = cv::getVersionMajor();
    int v_minor = cv::getVersionMinor();
    LOGI("major %s", v_major);
    LOGI("minor %s", v_minor);
    std::string vs = cv::getVersionString();
    return env->NewStringUTF(vs.c_str());
}

 

(6)运行输出:

76306d930b2c45fba6e33777697d228f.png

 

 

 

 

附录,OpenCL的一些so库:

OpenCLDemo/app/src/main/jniLibs at master · csarron/OpenCLDemo · GitHubOpenCLDemo for Redmi Note 4X (nikel, MTK), Nexus 5, Nexus 6p and Pixel 2 - OpenCLDemo/app/src/main/jniLibs at master · csarron/OpenCLDemohttps://github.com/csarron/OpenCLDemo/tree/master/app/src/main/jniLibs这些库大部分不一定必须放在cpp目录下的jniLibs里面通过CMakeLists.txt配置,可以直接放到更外层的app\libs\arm64-v8a等下面。

 

 

Android JNI配置CMakeLists.txt修改.cpp在logcat打印日志_zhangphil的博客-CSDN博客以上完成后,就可以在Java层像使用普通Java函数一样使用getStringCpp()其中,loadLibrary()里面填写的即是(2)里面的xxx.cpp的xxx名字。需要注意的,现在一般是64位的so库,如果app\libs下没有\arm64-v8a文件夹,需要新建arm64-v8a目录文件,然后把64位的so库放到。(2)在module的路径下,比如app\下,如果有app\libs目录,不需新建,如果没有,在app\下,新建libs,形成\app\libs目录。https://blog.csdn.net/zhangphil/article/details/130423157

 

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

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

相关文章

Nautilus Chain上首个DEX PoseiSwap即将开启IDO

据悉&#xff0c;Nautilus Chain 上的首个 DEX PoseiSwap 即将开启 IDO &#xff0c;根据官方的最新公告显示&#xff0c;PoseiSwap 即将于 6 月 13 日至 6 月 14 日期间&#xff0c;在 Bounce 平台开启其治理通证 $POSE 的 IDO&#xff08;Initial DEX Offering&#xff09;&a…

数据分析--Numpy初级(一)

Numpy初级 Ndarray对象dtype对象 Numpy是数据分析的基础库&#xff0c;它支持大量的维度计算与矩阵运算。同时他也是一个运行速度非常快的数学库&#xff0c;主要用于数组计算&#xff0c;具有线性代数、傅里叶变换、随机数生成等功能。 Ndarray对象 Numpy最重要的一个特点就…

【内部类】

目录 1.什么是内部类2.内部类分类2.1静态内部类2.非静态内部类2.3 局部内部类&#xff08;几乎不用&#xff0c;大家了解&#xff09; 3.匿名内部类 1.什么是内部类 在Java中&#xff0c;可以将一个类定义在一个类中或者在一个方法中&#xff0c;前者称为内部类&#xff0c;后…

JAVA打印Hello World的底层实现

任何一个学过JAVA的人应该都对这段代码非常熟悉。空闲时间翻了下代码&#xff0c;看看它的底层是怎么实现的 public class HelloWorld {public static void main(String[] args) {System.out.print("Hello, World!");} }首先点开out&#xff0c;发现它是System类中的…

JAVA微服务_网关

服务网关 什么是服务网关/API网关 API Gateway&#xff08;APIGW / API 网关&#xff09;&#xff0c;顾名思义&#xff0c;是系统对外的唯一入口。API网关封装了系统内部架构&#xff0c;为每个客户端提供定制的API。 近几年来移动应用与企业间互联需求的兴起。从以前单一的…

数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)

目录 问题分类 无权图单源最短路径算法 思路 伪代码 时间复杂度 代码实现&#xff08;C语言&#xff09; 有权图单源最短路径算法 Dijkstra&#xff08;迪杰斯特拉&#xff09;算法 伪代码 时间复杂度 代码实现&#xff08;C语言&#xff09; 多源最短路径算法 …

《Apollo 智能驾驶进阶课程》四、感知

1. 感知概貌 2. 传感器和标定 激光雷达&#xff1a;主动式&#xff0c;发射功率限制 Camera: 被动式&#xff0c;受到光照影响大 Radar : 多普勒效率 相对速度 超声波: 感知距离有限&#xff0c;倒车时使用。 … 最后设备还在研发过程中。 PnP问题&#xff0c;解决标定。 IC…

chatgpt赋能python:Python实现字符串匹配的SEO优化

Python实现字符串匹配的SEO优化 在现代网络中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已成为一项必不可少的技能。它涉及到网站的排名、用户的流量和营销策略等方面。关键字匹配是一种常见的SEO技术&#xff0c;它可以帮助你的网站在搜索引擎中排名更高。 本篇文…

Java 实现判定顺序表中是否包含某个元素的方法

一、思路 1.定义一个toFind变量来传入要查找的元素 2.遍历整个顺序表并判定当前下标的元素等不等于toFind 3.如果等于就返回一个true&#xff0c;否则返回false。 二、图解 首先调用以下的方法求出顺序表的长度&#xff0c;再使用 for 循环遍历每一个元素。 // 求顺序表的长…

《嵌入式系统》知识总结9:使用STM32固件库操纵GPIO

STM32固件库&#xff08;函数库&#xff09; “STM32 标准函数库”它是由 ST 公司针对 STM32 提供的函数接口&#xff0c;即 API (Application Program Interface)&#xff0c;开发者可调用这些函数接口来配置 STM32的寄存器&#xff0c;使开发人员得以脱离最底层的寄存器操作&…

《阿里大数据之路》研读笔记(1)

首先先看到OLAP和OLTP的区别&#xff1a; OLTP(Online transaction processing):在线/联机事务处理。典型的OLTP类操作都比较简单&#xff0c;主要是对数据库中的数据进行增删改查&#xff0c;操作主体一般是产品的用户或者是操作人员。 OLAP(Online analytical processing):…

libVLC 抓取视频帧并渲染(QGraphicsView)

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在《libVLC 抓取视频帧并渲染(QWidget)》介绍完 QWidget 对视频帧的渲染之后,是时候介绍第二种方式了 - QGraphicsView/QGraphicsScene/QGraphicsItem 图形视图框架。 基本步骤:自定义一个 QGraphicsIte…

RK3588平台开发系列讲解(驱动基础篇)等待队列

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、等待队列二、等待队列头三、等待队列项四、添加/删除队列五、等待唤醒六、等待事件沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧…

KeepChatGPT: chatGPT增强插件,解决报错、保持活跃,让AI更丝滑

KeepChatGPT&#xff1a; chatGPT增强插件&#xff0c;解决报错、保持活跃&#xff0c;让AI更丝滑 这是一个ChatGPT的畅聊与增强插件。开源免费。不仅能解决所有报错不再刷新&#xff0c;还有保持活跃、取消审计、克隆对话、净化首页、展示大屏、展示全屏、言无不尽、拦截跟踪…

周赛348(模拟、反向思维、数位DP)

文章目录 [6462. 最小化字符串长度](https://leetcode.cn/problems/minimize-string-length/)阅读理解 [6424. 半有序排列](https://leetcode.cn/problems/semi-ordered-permutation/)模拟 [6472. 查询后矩阵的和](https://leetcode.cn/problems/sum-of-matrix-after-queries/)…

java并发编程:volatile关键字详解

文章目录 内存可见性禁止重排序什么是重排序?重排序的类型有哪些呢&#xff1f; 内存屏障volatile的用途 在Java中&#xff0c;volatile关键字有特殊的内存语义。volatile主要有以下两个功能&#xff1a; 保证变量的内存可见性禁止volatile变量与普通变量重排序 内存可见性 …

RK3588平台开发系列讲解(驱动基础篇)中断下文之 tasklet

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、中断下文之 tasklet二、tasklet相关函数介绍三、tasklet使用示例四、中断视频介绍沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 介绍中断下文之 tasklet 的基础理论知识。 一、中断下文之 tasklet 中断…

C C++ 的内存管理(C++)

目录 C / C 的内存分布 C / C 程序内存区域划分&#xff1a;​ C语言内存管理 C中动态内存管理方式&#xff1a; C内存管理 C内存管理的方式&#xff1a; new / delete 操作内置类型 new 和 delete 操作自定义类型 new 和 delete 与 malloc 和 free 的区别&#xff1a; operato…

基于Springboot的漫画之家系统设计实现

&#x1f49e;文末获取源码联系&#x1f649; &#x1f447;&#x1f3fb; 精选专栏推荐收藏订阅&#x1f447;&#x1f3fb; &#x1f380;Java项目精选实战案例《600套》&#x1f618; https://blog.csdn.net/rucoding/category_12319634.html 文章目录 1、演示视频2、课题背…

QSS盒子模型入门指南:了解和应用基础知识

目录 1. QSS盒子模型的组成部分2. QSS盒子模型的属性3. QSS盒子模型的布局4. QSS盒子模型的调试工具结论 #概述 QSS&#xff08;Qt Style Sheets&#xff09;是一种用于美化和定制化Qt应用程序的样式表语言。了解和掌握QSS盒子模型的基本概念对于创建漂亮的用户界面布局至关重要…