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

Android NDK开发实战之环境搭建篇(so库,Gemini ai)

文章流程

        音视频安卓开发首先涉及到ffmpeg编译打包动态库,先了解动态库之间的cpu架构差异性。然后再搭建可运行的Android 环境。

So库适配

⽇常开发我们经常会使⽤到第三库,涉及到底层的语⾳,视频等都需要添加so库。⽽so库的体积⼀般来说 ⾮常的⼤,不搞清楚随意添加会导致apk体积暴增。

今天就简单分析⼀下,各个架构的cpu的区别,读者只要能⼤致了解这些⽬录的含义就可以 了,不必深究。

32位处理器与64位处理器区别

32 位处理器与 64 位处理器之间的主要区别涉及计算能力、内存寻址、性能以及支持的操作系统和应用程序

位数和数据处理能力

  • 32 位处理器:使用 32 位的地址总线,能够处理 32 位的数据。
    • 最大能够寻址的内存为 4 GB(2^32 字节)。
  • 64 位处理器:使用 64 位的地址总线,能够处理 64 位的数据。
    • 理论上,最大能够寻址的内存为 16 EB(Exabytes,2^64 字节),实际可用内存通常受到操作系统和硬件的限制。

操作系统和软件支持

  • 32 位处理器:只能运行 32 位的操作系统和应用程序。
  • 64 位处理器:可以运行 64 位的操作系统,并且通常也支持运行 32 位应用程序(通过兼容模式)。

性能

  • 32 位处理器:在处理较小的数据类型(如整数和字符)时可能比较高效,但在处理大数据时效率较低。
  • 64 位处理器:能够在一次操作中处理更多的数据,提供更高的性能,尤其是在数据密集型的应用程序中(如图像处理、大数据计算等)。

指令集

  • 32 位处理器:使用较少的指令集,功能相对简单。
  • 64 位处理器:通常具有更丰富的指令集,支持更多的指令和功能,能够提高编程的灵活性和性能。

应用场景

  • 32 位处理器:适合于资源受限的设备(如嵌入式系统)和运行较老软件的场景。
  • 64 位处理器:适合于需要高性能计算的应用场景,如服务器、大型数据库、高端工作站和现代桌面计算。

小结:32 位和 64 位处理器之间的主要区别在于内存寻址能力、处理性能和支持的软件环境。64 位处理器提供更高的性能和更大的内存支持,是现代计算的主流选择。对于需要处理大量数据或运行复杂应用程序的用户,64 位处理器更加合适。

.so库

.so库是什么, NDK编译出来的动态链接库。⼀些重要的加密算法或者核⼼协议⼀般都⽤c/c++写然后给java调⽤。这样可以避免反编译后查看到应⽤ 的源码

.so库⼜该如何存放?

处理.so⽂件时有⼀条简单却并不知名的重要法则。 你应该尽可能的提供专为每个ABI优化过的.so⽂件,但要么全部⽀持,要么都不⽀持:你不应该混合着使 ⽤。你应该为每个ABI⽬录提供对应的.so⽂件。

ABI : application binary interface 是规范.

EABI : Embedded application binary interface 2 EABI : 是 arm 对于 ABI规范的⽐较新(2005年)的实现 // powerpc也有⼀个实现叫做EABI

举例:

 

CPU架构

Android⽬前⽀持以下7种ABIs(Application Binary Interface的缩写,即应⽤⼆进制接⼝):mips, mips64, X86, X86-64, arm64-v8a, armeabi, armeabi-v7a

 如何选择?

 ⼤⼚App如何选择so库:值得⼀提的是,这4⼤App都只适配了⼀种Cpu架构

架构的兼容性

直接说结论:新版本兼容旧版本,带来的影响是性能上的区别,旧版本不一定支持新版。

适配⽅案选择 

⽅案⼀:只适配armeabi   优点:基本上适配了全部CPU架构(除了淘汰的mips和mips_64) armeabi,armewabi 缺点:性能低,相当于在绝⼤多数⼿机上都是需要辅助ABI或动态转码来兼容(CPU⾃⼰做的)

⽅案⼆:只适配armeabi-v7a   同理⽅案⼀,只是⼜筛掉了⼀部分⽼旧设备,在性能和兼容⼆者中⽐较平衡

⽅案三: 只适配arm64-v8 优点: 性能最佳 缺点:只能运⾏在arm64-v8上,要放弃部分⽼旧设备⽤户。

Google Play 从2019年8⽉开始,就强制APP适配arm64-v8a,以慢慢淘汰32位的armeabi-v7a。

注意事项

如果你的App同时存在两种架构如:"armeabi", "arm64 v8a"。那么不同Cpu架构的⼿机便只会加载对应的SO库不再向下兼容。 所以需要编译两份版本的.SO库文件。

后记 性能+兼容能否兼得?

可以实现的那就是 abi split,分包,实现也很简单,在gradle 中添加如下配置:+

android {...defaultConfig {...// 支持的 ABI 列表ndk {abiFilters "x86", "x86_64", "arm64-v8a", "armeabi", "armeabi-v7a"}}...
}

分别打包三个版本,并对每款进行单独apk打包。这样,即能保证兼容问题,⼜能保证性能,⼜能不额外增加APK的⼤⼩,因为可以为所有架构都单独 打⼀个包,⼀举多得

总结:这对我们进行在不同架构编译SO库,运行程序有深入理解。

理解架构差异:通过学习32位和64位处理器的区别,理解了不同架构对应用性能的影响和兼容性问题

掌握适配策略:了解了如何根据市场需求和设备分布选择合适的适配方案,平衡性能和兼容性。

实践中的应用:学会了如何在Gradle中配置abiFiltersabi split,优化APK的体积和性能。

NDK(Native Development Kit) 本地开发⼯具包

Android NDK 是在SDK前⾯⼜加上了原⽣⼆字,即Native Development Kit,因此⼜被Google称为 NDK。允许使⽤原⽣语⾔(C和C++)来实现应⽤程序的部分功能。给java语言调用

(1)native coder执⾏⾼效:⼤量的运算(极品⻜⻋),万能解码(ffmpeg),Opengl(3D 渲染) (2)通过jni技术,可以扩展Android⼿机的功能-wifi热点

(3)代码的复⽤:ffmpeg, opnencv(⼈脸识别库)

(4)使⽤场景:考虑特殊情况(效率/操作硬件)

库⽂件类型:

linux:静态库.a 动态库.so   

windows:动态库.dll

JNI(Java Native Interface)Java本地接⼝ 

Java Native Interface (JNI) 是一种编程框架,它使得 Java 代码可以调用和被其他语言(如 C 或 C++)编写的本地应用程序和库。JNI 主要用于在 Java 应用程序中集成或使用底层系统功能,或者在需要高性能执行时利用现有的本地代码。

CMake和ndk-build 

CMake 和 ndk-build 是用于 Android NDK(Native Development Kit)开发的两种构建系统

CMake 是一个跨平台的开源构建系统,它使用 CMakeLists.txt 文件来描述项目的构建过程。CMake 支持多种编译器和构建工具,能够生成特定平台的构建文件。

CMake优点

  1. 跨平台支持:CMake 可以生成适用于不同平台的构建文件(如 Makefile、Visual Studio 项目文件等)。
  2. 现代化支持:CMake 对 C++11、C++14 等现代 C++ 特性的支持较好。
  3. 集成 IDE 支持:许多集成开发环境(IDE)如 Android Studio 和 Visual Studio 都原生支持 CMake。
  4. 模块化:CMake 可以很方便地管理大型项目的依赖和模块。
cmake_minimum_required(VERSION 3.4.1)# 添加库
add_library(native-lib SHARED native-lib.cpp)# 查找 NDK 库
find_library(log-lib log)# 链接库
target_link_libraries(native-lib ${log-lib})

ndk-build 是 Android NDK 自带的构建系统,使用 Android.mk 和 Application.mk 文件来定义构建规则。它是较早的构建工具,专门用于 Android NDK 项目。

ndk-build 优点

  1. 简单易用:对于小型项目,ndk-build 的使用较为简单直观。
  2. 集成方便:与 Android Studio 集成良好,能够快速构建和测试 NDK 代码。
  3. 现有项目兼容性:对已有的 Android NDK 项目,使用 ndk-build 可能更为方便。
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := native-lib
LOCAL_SRC_FILES := native-lib.cppinclude $(BUILD_SHARED_LIBRARY)

选择 CMake 还是 ndk-build

  • 项目规模

    • 对于小型项目,ndk-build 可能更简单直接。
    • 对于大型项目,CMake 更加灵活和强大,支持更复杂的依赖管理。
  • 团队协作

    • 如果团队中有成员熟悉 CMake,建议使用 CMake 以便于协作。
    • 如果团队主要使用 ndk-build,继续使用可能更高效。
  • 现代化需求

    • CMake 对现代 C++ 特性的支持更好,适合需要使用新特性的项目。
  • IDE 兼容性

    • 如果使用 Android Studio,CMake 是官方推荐的构建系统,提供更好的集成体验。

对于新项目,CMake 通常是更好的选择,而对于已有的 ndk-build 项目,继续使用可能会更方便。

 安装android stdio

android stdio就是安卓开发的idm,基本都使用这个。对于刚入门来说不友好,这边建议下载最新版本2024.2,因为内置ai,而且比旧版本更简单使用。

下载 Android Studio 和应用工具 - Android 开发者  |  Android Developers

由于大学时期已经安装过android stdio,可以参考下列链接安装选项即可

Android Studio2024版本安装环境SDK、Gradle配置_android-studio-2024.1.2.12-windows.exe-CSDN博客

下载 CMake和ndk-build 

 

首次项目error

原因:没装gradle-8.9包,通过官网拉取又失败,即使开梯子也不行。刚创建时选的java版本导致。我们重新创建项目,环境:android 14.0 api 34 gradle-8.9-bin.zip。跟着步骤走

 

 通过网盘分享的文件:gradle-8.9-bin.zip
链接: https://pan.baidu.com/s/1GzLMctUYZtxX2TerZbpzFQ 提取码: 49kg 
--来自百度网盘超级会员v6的分享

 下载完拷贝到指定目录下,这是官方默认路劲。使用即可

distributionUrl=file:///C:/Users/xxxxxxx/.gradle/wrapper/dists/gradle-8.9-bin.zip

 随后点击代码文件,会自动下载需要模块。这个过程大概5-10分钟

再次同步项目试试。 

 

没报错就没事了。 

虚拟手机

由于是安卓开发,所以需要虚拟手机,我们使用默认的即可。注意版本适配。

分别是手机列表,手机实体,内置ai软件

代码运行和调试 一些翻译 

 至此成功运行第一个程序

Gemini ai环境配置

Gemini(Android Studio 的 AI 助手)在中国地区无法直接使用所以必须使用梯子进行,进行google账号登录验证才能成功。否则会超时。

根据自己梯子软件,选择好本地端口。

最终ai环境搭建成功。

学习资料分享

0voice · GitHub


http://www.mrgr.cn/news/82589.html

相关文章:

  • windeployqt.exe打包qt程序总结(MSVC)
  • Laravel操作ElasticSearch
  • 【通俗理解】AI的两次寒冬:从感知机困局到深度学习前夜
  • Postgresql中clog与xid对应关系计算方法(速查表)
  • Vue Router v3.x 路由进阶【路由篇】
  • STM32-笔记26-WWDG窗口看门狗
  • 【小制作】米家模拟手指点击
  • Linux(Centos 7.6)命令详解:cd
  • 2007年IMO几何预选题第8题
  • DiT(Diffusion Transformer)详解——AIGC时代的新宠儿
  • 解读 C++23 std::expected 函数式写法
  • Linux操作系统下,挂ILA
  • LeetCode -Hot100 - 53. 最大子数组和
  • 2025/1/4期末复习 密码学 按老师指点大纲复习
  • 鸿蒙MPChart图表自定义(六)在图表中绘制游标
  • 【MySQL基础篇重点】八、复合查询
  • leetcode刷题笔记
  • iOS 逆向学习 - iOS Architecture Cocoa Touch Layer
  • 组会 | DenseNet
  • HCIA-Access V2.5_7_3_XG(S)原理_关键技术
  • sql server期末复习
  • 内部类 --- (寄生的哲学)
  • 对计网大题的一些指正(中间介绍一下CDM的原理和应用)
  • springCloud 脚手架项目功能模块:Java分布式锁
  • 对一段已知行情用python中画出K线图~
  • 从零开始RTSP协议的实时流媒体拉流(pull)的设计与实现(一)