当前位置: 首页 > news >正文

如何重新编译HyperLPR原生库以消除16k对齐警告

背景

HyperLPR是国内一个开源的车牌识别通用库,它支持很多环境,使用简便,开箱即用,很多开发小伙伴都很喜欢用它。笔者在做一款 Android 应用时也用到了它。

之前笔者介绍了怎样对它进行改造以便让它支持CameraX.   这次我们讨论另外一个话题:如何让它支持16k对齐。

从事Android开发的小伙伴,如果你的AGP/Gradle升级到了比较新的版本,然后API也是用的最新的36(Android 15)而你也刚好用到了一些第三方的原生库so,  Android Studio 可能会冒出一个警告,类似下面这样:

编译打包时也会弹出一个明确的警告窗口要求16k对齐。

相信一定有很多像我这样对自己有严格要求的开发小伙伴,希望自己的作品尽善尽美,不想出现任何警告信息。

这个警告的意思是你引用的原生库需要在编译时进行16k对齐。一查这是谷歌针对最新的Android 15推出的性能优化措施。具体来说,现在的手机内存越来越大,16k对齐是指使用内存时数据必须从内存的16k的整数倍位置开始存储。这有点类似64位程序之于32位程序,也许你对这些细节不感兴趣,那内在的东西我们可以不用管它,反正你只要知道这是谷歌提高性能的措施。而之前的so库的编译默认都是4k对齐的,所以大部分的原生库都会遇到这个警告。谷歌声称,2025年11月以后,所有用到原生库的app都必需要16k对齐,否则不让上架。所以这不是一个不痛不痒的警告,需要引起重视。

但是很多第三方库都是多年前就编译好了的一直没动了,也没看到有人出面优化处理一下。毕竟这是开源的软件,不是你的供应商,别人没有义务为你处理。如果实在没人管,那我们就得自己动手处理了。本文就给大家介绍如何重新编译hyperlpr这个原生库。对于初学者这个过程可能有一点点繁琐,不过如果严格按照文章的步骤是可以成功的。

使用软件及环境设置

我们以Windows 为示例环境讲解,其它的环境如 Linux 或 Mac 系统大同小异,有些编译工具系统自带。但Windows环境都得自己下载

本文假定你已经安装好了 git,这个一般小伙伴们都有了,不作赘述。

下载HyperLPR软件源代码

要做红烧猪蹄,你得先把猪蹄买回来再说。

为了重新编译so库,我们需要先下载这个原生库相关的源代码。

我们先下载 hyperlpr 的 android开发包

Hyperlpr3 Android 开发包

这个就是我们在自己的项目里直接引用的库,我们用到的原生库就是通过这个包装好的android开发包引入的。

dependencies {implementation 'com.github.HyperInspire:hyperlpr3-android-sdk:1.0.3'
}

git clone https://github.com/HyperInspire/hyperlpr3-android-sdk.git

我们的目的是要去掉这个远程引用库,改为引用自己重新对齐编译后的开发包。

假定我们把程序git 下载到了 D:\git 这个目录,下同。

这个库的这个目录里躺着的正是我们需要处理的原生库libhyperlpr3.so

D:\git\hyperlpr3-android-sdk\hyperlpr3\libs\arm64-v8a\libhyperlpr3.so

HyperLPR 原生库代码

下面这个是HyperLPR原生库代码:

git clone https://github.com/szad670401/HyperLPR.git

这就是用来生成libhyperlpr3.so文件的。

通用图形库组件 MNN

编译HyperLPR必须用到阿里的一个通用图形库,也是开源的

git clone https://github.com/alibaba/MNN.git

好,3套源代码我们下载好了,假定我们都下载到了D:\git目录下,如下所示:

编译工具&环境

 NDK

首先确认你已经下载好了NDK,再Android Studio里检查核对一下

下面我们开始准备一些工具

cmake

C++编译工具

https://cmake.org/download/

我下的zip版,下完解压,比如我们解压后重命名为 D:\cmake411

ninja

这是cmake的一个辅助编译工具,据说可以提高编译效率。

https://github.com/ninja-build/ninja/releases

我下的zip版,比如我们解压后放到 D:\ninja-win

OpenCV

编译还需要用到OpenCV的android sdk,OpenCV 是业界著名的开源通用图像处理库,很多第三方的图形处理工具都会用到它。

https://github.com/opencv/opencv/releases

假定解压后的目录为 D:\OpenCV-android-sdk

环境配置

一般安装好git 后在你的用户目录下会有一个~/.bash_profile文件

我的文件位置是在这里:C:\Users\Administrator\.bash_profile

我们在这里设置好各中变量和path路径:

export ANDROID_NDK="C:/Users/Administrator/AppData/Local/Android/Sdk/ndk/29.0.14033849/"
export JAVA_HOME=/d/jdk/jdk11
export MAVEN_HOME=/d/apache-maven-3.8.6
export GIT_HOME="/c/Program Files/Git"
export PATH=/usr/bin:/bin:/mingw64/bin:/mingw64/local/bin:/toolchains/llvm/prebuilt/windows-x86_64/bin:/c/windows:/c/windows/system32:/c/windows/System32/Wbem:/c/windows/System32/WindowsPowerShell/v1.0:/c/windows/System32/OpenSSH:$JAVA_HOME/bin:$MAVEN_HOME/bin:$GIT_HOME/cmd:/d/cmake411/bin:/d/ninja-win

对照自己的实际情况检查NDK的路径是否正确,注意PATH中必须包含cmake和ninja的正确路径。

编译&处理

下面我们就正式开始编译了。

编译&处理步骤:1 MNN, 2 hyperlpr3, 3 hyperlpr3开发包的aar, 4自己的项目引用

编译 MNN

我们在d:\git\MNN目录新建一个目录build_android,然后进入git 的 bash命令行窗口,执行如下脚本:

 cmake -G Ninja .. \
  -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \
  -DANDROID_ABI=arm64-v8a \
  -DANDROID_PLATFORM=android-21 \
  -DCMAKE_BUILD_TYPE=Release 

该命令会生成详细的cmake配置信息

执行完会发现build_android目录下多了很多文件。

然后就开始正式构建了,还是在build_android目录下执行如下命令:

cmake --build . --config Release

这时程序开始构建了,

C++的构建比较慢,中途你会看到窗口里面像猪大肠一样输出很多 .o 文件。

等待几分钟会构建完毕。

这时你会发现已经生成好了我们需要的libMNN.so文件,在如下目录:

D:\git\MNN\build_android\OFF\arm64-v8a\libMNN.so

构建hyperlpr需要用到这个文件

编译 HyperLPR

在构建hyperlpr之前我们需要修改CMakeList.txt, 加上16k对齐参数

在add_library..和target_link..之间添加此参数:

#新加的16K对齐
    target_link_options(${LIBRARY_NAME} PRIVATE
        "LINKER:-z,max-page-size=16384"
        "LINKER:-z,common-page-size=16384"
    )

同样的我们在D:\git\HyperLPR目录下新建一个build_android目录,然后在此目录打开git bash命令行窗口。

执行一下脚本

      cmake -G Ninja .. \
  -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \
  -DANDROID_ABI=arm64-v8a \
  -DANDROID_PLATFORM=android-21 \
  -DCMAKE_BUILD_TYPE=Release \
  -DOpenCV_DIR=/d/OpenCV-android-sdk/sdk/native/jni \
  -DMNN_INCLUDE_DIRS=/d/git/MNN/include \
  -DMNN_LIBS=/d/git/MNN/build_android/OFF/arm64-v8a

执行完就生成好了cmake配置文件。

下面开始正式构建,还是在build_android目录下执行:

cmake --build . --config Release

正式开始编译hyperlpr3了

构建完毕,你会发现在当前目录下生成好了so文件。

编译 HyperLPR Android开发包

将上面生成好的2个so文件

D:\git\MNN\build_android\OFF\arm64-v8a\libMNN.so

D:\git\HyperLPR\build_android\libhyperlpr3.so

复制到 android 开发包的库文件目录下:

D:\git\hyperlpr3-android-sdk\hyperlpr3\libs\arm64-v8a

开始编译andriod开发包,

在D:\git\hyperlpr3-android-sdk目录下打开命令窗口,或bash窗口,执行

./gradlew :hyperlpr3:assembleRelease

开始编译。实际上你也可以用Android Studio打开这个项目然后在终端窗口执行上面的命令

完成后会发现在下面的目录生成好了aar文件

D:\git\hyperlpr3-android-sdk\hyperlpr3\build\outputs\aar\hyperlpr3-release.aar

自己的项目变动

将上面生成好的hyperlpr3-release.aar文件复制到自己项目的app\libs目录下(如果没有libs目录自己建一下)

然后修改app下的构建文件build.gradle

去掉引用远程库,改为使用本地库。

// implementation 'com.github.HyperInspire:hyperlpr3-android-sdk:1.0.3'

implementation files('libs/hyperlpr3-release.aar')

这时再编译你自己的项目就大功告成了。这时编译打包不会再出现16K对齐的警告了。

总结

本文描述了如何将HyperLPR原生库加入16k对齐参数重新编译构建的方法。用户通过这个方法也可以掌握如何编译第三方原生库so的基本方法和步骤。

实际上如果你自己写的C++也需要加入文中所列出的参数进行16K对齐。

如果编译过程中出现错误一般都不是什么大问题,原因都是path路径设置不对啥的。自己问AI就能得到答案。编译之前仔细按照上面的步骤是否缺软件工具,并检查PATH路径是否设置正确。

http://www.dtcms.com/a/398136.html

相关文章:

  • [QT]常用控件属性一
  • QT 编写应力分析软件
  • INTLAB区间工具箱在区间分析算法中的应用与实现
  • 北京网页设计新趋势黄石市seo关键词优化怎么做
  • 【Linux】拆解 Linux 容器化核心:Namespace 隔离 + cgroups 资源控制,附 LXC 容器生命周期实战
  • VSCode IDE环境的python 显示:Import “rclpy“ could not be resolvedPylancer
  • 吴镇宇做的电影教学网站石家庄最新消息今天
  • MySQL笔记8
  • 【C++无数组矩阵对角线平均值保留2位小数】2022-11-18
  • 阿里巴巴网站费用怎么做分录烟台企业展厅设计
  • ZooKeeper与Kafka分布式协调系统实战指南:从基础原理到集群部署
  • lesson66:JavaScript BOM与DOM全解析:从基础到现代前端实践引言:前端开发的两大基石
  • UNIAPP如何自定义全局方法?
  • 040 线程控制
  • 前端开发利器:nvm、npm与pnpm全面解析与TypeScript/JavaScript选择指南
  • 电影网站如何做seo哪家网站建设公司好
  • LeetCode 刷题【90. 子集 II】
  • Spring Boot启动报错:Failed to configure a DataSource 全面解析与解决方案
  • MongoDB源码delete分析观察者getOpObserver()->onDelete
  • 企业网站模板htmlwordpress cos 配置
  • ACL 2025 Time-LlaMA 大语言模型高效适配时间序列预测
  • 2025开发者云服务器评测:AWS, Vercel, Railway该如何选?
  • 金融数据库--下载全市场股票日线行情数据
  • HTML `<meter>` 标签:原生度量衡指示器,直观展示百分比、评分等量化数据
  • 平安养老险广西分公司 | 开展金融知识公益宣教活动
  • 威海北京网站建设怎么做网站推广世界杯
  • php的网站模板下载如何修改自己的网站标题
  • VS Code 格式化配置优先级与作用机制(不含ESlint)
  • python+springboot+uniapp微信小程序“美好食荐”系统 美食推荐 菜谱展示 用户互动 评论收藏系统
  • 微信小程序页面滚动到指定位置