openblas 第二弹: openblas Android版调用和编译

2023-11-16

1:编译

如果需要在Android下使用openblas,则需要编译Android版本的openblas.a文件进行调用。

1:openblas的编译时主要参考链接:

  • 参考链接一

  • 参考链接二

  • 具体细节太久了,已经忘了,下面是编译好的时候的环境变量:

    • export PATH=/tmp/my-android/bin:$PATH
    • export NDK=home/sbb/tools/android-ndk-r14b
    • export SYSROOT=$NDK/platforms/android-19/arch-arm

ps:如果没有特殊要求,可以选择已经编译好的Android版本,armV8版本目前没有编译好的,有需要的话需要自行编译,编译过程挺繁琐,完全没必要去采坑:

链接地址:目前支持armV7和armV6

2:ndk编译中Android使用

  • 关于如何配置ndk 使得其能够编译,下面的链接说的非常清楚

    链接地址

  • Android.mk 和 Application.mk具体配置

    • 其中的Application.mk定义了具体的,目标编译架构,平台和Android版本
APP_ABI := armeabi-v7a
APP_STL := gnustl_static

APP_PLATFORM := android-18
NDK_TOOLCHAIN_VERSION := 4.9
  • 其中的Android.mk定义了编译顺序,编译的源文件,依赖等等,如下给出配置的各种含义:

    • LOCAL_PATH := $(call my-dir)
      • 获取ndk编译时的当前路径
    • include $(CLEAR_VARS)
      • 清除以LOCAL_** 为开头的变量,例如LOCAL_MODULE, LOCAL_SRC_FILES, and LOCAL_STATIC_LIBRARIES
    • LOCAL_MODULE := hello-jni
      • 自动加上lib,生成一个libhello-jni.so文件
    • include $(BUILD_SHARED_LIBRARY)
      • 构建系统生成一个.so 文件
    • include $(BUILD_STATIC_LIBRARY)
      • 构建系统生成一个.a 文件
    • include $(PREBUILT_SHARED_LIBRARY)
      • 包含一些预编译文件"*.so"
    • 如下是项目中的具体配置,依赖两个文件,最终将生成两个目标文件:
LOCAL_PATH := $(call my-dir)
LOCAL_PREBUILT_DIR := prebuilt

#加入依赖项,openblas相关
include $(CLEAR_VARS)
LOCAL_MODULE := openblas
LOCAL_SRC_FILES :=$(LOCAL_PREBUILT_DIR)/openblas/lib/libopenblas.a
include $(PREBUILT_STATIC_LIBRARY)

#加入依赖项,一个预编译文件
include $(CLEAR_VARS)
LOCAL_MODULE := cvface_api
LOCAL_SRC_FILES := $(LOCAL_PREBUILT_DIR)/lib/$(TARGET_ARCH_ABI)/libcvface_api.so
include $(PREBUILT_SHARED_LIBRARY)

#加入依赖项,部分修改的源文件
include $(CLEAR_VARS)
LOCAL_MODULE := jni_cvface_api
LOCAL_SRC_FILES += common.cpp \
                                com_sensetime_faceapi_CvFaceLibrary.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(LOCAL_PREBUILT_DIR)/include

# 加入本模块编译依赖的模块,openblas和cvface_api
LOCAL_STATIC_LIBRARIES := openblas
LOCAL_SHARED_LIBRARIES := cvface_api

LOCAL_LDLIBS := -llog -ljnigraphics
LOCAL_LDFLAGS += -Wl,--gc-sections
include $(BUILD_SHARED_LIBRARY)

  • 编译带有openblas支持的本项目的目录结构:
报错相关:
  • 1.调用问题:JNI和java层调用相关,老是提示
No implementation found for int com.st.faceapi.CvFaceLibrary.cvFaceGetFeatureMulitArray(float[][], float[])
  • 解决方案:

    • 常规方案:(1)在使用jni编译的文件和java相互调用时,经常出现接口找不到,首先需要查看在java代码的定义和jni中定义的参数和名称是否相同。

    • (2)jni接口无法找到:

      参考链接

    • 最终原因是在编译的Android.mk出现错误,在同一个模块出现:

    LOCAL_SRC_FILES := A.cpp
    LOCAL_SRC_FILES := B.cpp 
    

    这样导致,虽然实现了,但是接口是找不到的,因为后一个将前一个覆盖了,故而更改为:

    LOCAL_SRC_FILES := A.cpp
    LOCAL_SRC_FILES += B.cpp
    

    问题得到解决

  • 2:报错描述:

    • 出现了一种错误,在使用ndk编译时,并没有报出任何错误,在程序运行时,也并未提示说明,接口的缺失,但是,程序就是不停的在运行,无法显示最终的测试结果
  • 解决方案:

    • 逐个排查,java层没有问题,最终发现是jni层部分代码写错了,出现一些未知定义和未知语法,令人奇怪的是,这些错误在使用ndk编译时是发现不了的。jni新增代码逐行注释,删除有问题代码即可。

ps:参考链接

1:openblas中有不少相关的编译指导,打开后的侧边栏:
https://github.com/xianyi/OpenBLAS/wiki

2:ndk 编译参考链接:
http://blog.csdn.net/smfwuxiao/article/details/8523087

3:ndk编译中,Android.mk各个参数配置信息的含义:
https://developer.android.com/ndk/guides/android_mk.html#var
4:百度网盘链接:
链接:https://pan.baidu.com/s/1pWLxQcFoOFz7kQnXaCwtsA
提取码:eb87

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openblas 第二弹: openblas Android版调用和编译 的相关文章

随机推荐

  • 更新powershell 7.3.2

    最近在使用VsCode时打开中断会时常提示你powershell已经更新前往地址下载 但是跳转到的页面描述有时候看不太清晰 于是去b站结合网络文档还是成功更新了 有兴趣的朋友可以通过这个链接查看一下在线文档 gt powershell的在线
  • ASPxTextBox中数据有效性设置

    1 选中ASPxTextBox控件 2 设置属性 Validationsettings中errordisplaymode requiredfield中errortext和isrequired 3 结果 4 总图
  • 100天精通Python(可视化篇)——第78天:matplotlib绘图模块基础入门大全

    文章目录 专栏导读 一 课程介绍 为什么要学习matplotlib 什么是matplotlib 二 绘制折线图 基础绘图 设置图片大小和分辨率 调整X或者Y轴上的刻度 设置中文显示 坐标轴添加描述信息 绘制网格 双折线图 添加图例 自定义绘
  • unittest使用ddt数据驱动的小demo

    一 ddt简介 1 ddt是 data driven testing的缩写 中文含义是数据驱动测试 2 ddt通常与unittest组合使用 常用的包有ddt data unpack file data 我这边使用前两种 二 ddt安装 1
  • word怎么改一张纸的方向_word单页怎么改变纸张方向

    word改变单页纸张方向的方法 1 将插入点移动到需要修改的单页的开头 2 在 布局 菜单中 分隔符 下选择 下一页 3 点击 纸张方向 选择 横向 4 将插入点移动到下一页的开头 再点击 分隔符 的 下一页 再点击 纵向 即可 本教程操作
  • el-tree和el-table相关使用

    文章目录 el tree实现模糊查询 el tree实现node节点增删改 el tree 实现节点懒加载 el tree获取所有选中的当前节点 el tree获取当前节点及其选中父节点 el table 获取多选行的所有节点 el tab
  • 产消合一。有感于华人新首富赵长鹏投资福布斯的话

    DAO Web 3 0引领的新时代是 产消合一的经济 逐渐发展成为 融投研产消宣多种角色为一身 有感于赵长鹏希望投资福布斯 xxFi或xx To Earn含DeFi GameFi Play To Earn P2E SocialFi Read
  • ES搜索引擎入门+最佳实践(一)

    ES在搜索和数据分析中的应用越来越广泛 在之前项目中对ES的使用有些心得 最近有不少朋友和同事都问到了ES 刚好最近也有些时间 所以打算通过8 10篇文章介绍下ES 其实我也不知道最终会写下多少篇 一 概述 本篇文章计划给大家介绍什么ES
  • CVPR2022 |小红书首创多图交互建模挑战热门研究课题,大幅提升行人重识别性能

    在CVPR2022上 小红书多模态算法组提出一种新颖的用于行人重识别的网络Neighbor Transformer NFormer 区别于传统的行人重识别网络仅仅对单张图片进行建模 NFormer对通过transformer对多张输入图像进
  • PWN保护机制以及编译方法

    0x00 声明 以下内容 来自先知社区的作者逆向萌新原创 由于传播 利用此文所提供的信息而造成的任何直接或间接的后果和损失 均由使用者本人负责 长白山攻防实验室以及文章作者不承担任何责任 0x01前言 Ctf中的pwn题 在利用gcc编译的
  • 调试不方便?我直接把公众号网页线上环境搬到本地

    在开发微信公众号网页时 我们最关心的一个问题就是调试 怎么调试线上环境 调试是否足够方便 本文分享一种能够极大提高效率的微信公众号网页开发调试技巧 可以实现在本地开发时直连线上生产环境 如果你还不清楚这种场景下的调试技巧 不妨花几分钟阅读本
  • 判断是否有统计意义/差异具有显著性/具有显著差异/零假设(希望证明为错误的假设)/卡方检验

    目录 1 有统计学意义 2 差异具有显著性 3 具有显著差异 4 统计学中的假设 4 1 零假设 4 2 备择假设 5 卡方检验 6 有统计学意义 和 差异显著 的区别 参考资料 1 有统计学意义 统计学意义是指在研究组和对照组间出现疗效差
  • Django-42-ORM多对多查询(ManyToManyField自动创建)

    前提 初始表数据 手动创建与自动创建的区别主要在于自动创建的表没有第三张可操作的表 其他没区别 此篇仅以自动创建为例说明 book表 author表 book authors表 关系表 django study app01 views py
  • 渗压计特性特点计算方法应用

    渗压计是一种测量渗流水或静力压力的传感器 适用于回填或原位孔隙水压力的测定 扬压力的测定 水位或容器中流体压力的测定 具有抗干扰能力强 长期稳定 密封可靠等特点 广泛应用于建筑 铁路 交通 水电大 坝 隧道等土木工程领域 特性 结构简单 紧
  • 软件工程:(四)概要设计

    一 定义 概要设计是一个设计师根据用户交互过程和用户需求来形成交互框架和视觉框架的过程 其结果往往以反映交互控件布置 界面元素分组以及界面整体板式的页面框架图的形式来呈现 这是一个在用户研究和设计之间架起桥梁 使用户研究和设计无缝结合 将对
  • KNN实现手写数字识别

    其他实现手写数字识别的方法 1 聚类 K means 实现手写数字识别 2 卷积神经网络 CNN 实现手写数字识别 3 全连接神经网络实现手写数字识别 4 聚类 K means 实现手写数字识别 2 实验数据是老师收集了所有人的手写数字图片
  • jeesite快速开发平台(一)----简介

    以下内容来自官网 一 平台简介 JeeSite是基于多个优秀的开源项目 高度整合封装而成的高效 高性能 强安全性的开源Java EE快速开发平台 JeeSite是您快速完成项目的最佳基础平台解决方案 JeeSite是您想学习Java平台的最
  • 寄存器的基本原理

    参考大神博客 https blog csdn net qq 37340753 article details 80935423 https blog csdn net u012493828 article details 53439226
  • kali工具的使用

    一 netcat简介与使用 nc的全称为NetCat 它能够建立并接受传输控制协议 TCP 和用户数据报协议 UDP 的连接 Netcat可在这些连接上读写数据 直到连接关闭为止 它可以通过手工或者脚本与应用层的网络应用程序或服务进行交互
  • openblas 第二弹: openblas Android版调用和编译

    1 编译 如果需要在Android下使用openblas 则需要编译Android版本的openblas a文件进行调用 1 openblas的编译时主要参考链接 参考链接一 参考链接二 具体细节太久了 已经忘了 下面是编译好的时候的环境变