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分钟

再次同步项目试试。 

 

没报错就没事了。 

如何build?

虚拟手机

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

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

代码运行和调试 一些翻译 

 至此成功运行第一个程序

Gemini ai环境配置

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

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

最终ai环境搭建成功。

学习资料分享

0voice · GitHub

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

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

相关文章

【Java回顾】Day2 正则表达式----异常处理

参考资料:菜鸟教程 https://www.runoob.com/java/java-exceptions.html 正则表达式 有一部分没看完 介绍 字符串的模式搜索、编辑或处理文本java.util.regex包,包含了pattern和mathcer类,用于处理正则表达式的匹配操作。 捕获组 把多个字符…

Unity性能优化总结

目录 前言 移动端常见性能优化指标​编辑 包体大小优化 FPS CPU占用率 GPU占用率 内存 发热和耗电量 流量优化 前言 终于有时间了,我将在最近两个项目中进行优化的一些经验进行归纳总结以飨读者。因为我习惯用思维导图,所以归纳的内容主要以图来…

FTP上传下传、SFTP上传下传、进度监控、断点续传、连接池封装JAVA一网打尽(二)FTP高级篇【2/5】

一、摘要(本系列汇总说明) - 总纲 FTP、SFTP上传下传、进度监控、断点续传、连接池封装JAVA一网打尽(一)FTP、SFTP上传下传、进度监控、断点续传、连接池封装JAVA一网打尽(二)FTP、SFTP上传下传、进度监控…

北京航空航天大学惊现技术商业“宫斗剧”!背后隐藏的内幕遭曝光!

北京航空航天大学(以下称北航)与源亿(北京)网络科技有限公司(以下称源亿)的派驻的员工恶意串通,指定北京蚂蚁非标科技有限公司(以下称蚂蚁公司)挖走源亿公司在现场派驻的…

transfomer深度学习实战水果识别

本文采用RT-DETR作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。RT-DETR以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对水果数据集进行训练和优化,该数据集包含丰富的水果图像样本&#…

Python世界:人生苦短,我用Python

Python世界:人生苦短,我用Python 前言Python优势Python缺点 前言 几句话说清,我们为啥要用Python? Python设计之初心,是为了解决编程门槛,让大家更聚焦业务实现,而非编程细节。当前人工智能火…

TensorFlow深度学习实战(3)——深度学习中常用激活函数详解

TensorFlow深度学习实战(3)——深度学习中常用激活函数详解 0. 前言1. 引入激活函数1.1 感知器1.2 多层感知器1.3 训练感知器存在的问题 2. 激活函数3. 常见激活函数3.1 sigmoid3.2 tanh3.3 ReLU3.4 ELU和Leaky ReLU 小结系列链接 0. 前言 使用激活函数…

Linux vi/vim 编辑器:功能强大的文本处理工具

Linux vi/vim 编辑器:功能强大的文本处理工具 引言 Linux 系统中的 vi/vim 是一种功能强大的文本编辑器,它广泛应用于程序员、系统管理员和其他需要处理文本文件的用户群体中。vi 是 visual interface 的缩写,而 vim 则是 vi improved 的缩…

C#设计模式(行为型模式):状态模式

C#设计模式:状态模式 在软件开发中,我们经常会遇到对象的行为取决于其状态的情况。例如,一个订单对象可能处于“待支付”、“已支付”、“已发货”等不同状态,而每个状态下订单的行为(例如是否可以支付、是否可以发货…

数据结构C语言描述9(图文结合)--二叉树和特殊书的概念,二叉树“最傻瓜式创建”与前中后序的“递归”与“非递归遍历”

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;有C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…

Leetcode打卡:设计一个ATM机器

执行结果:通过 题目 2241 设计一个ATM机器 一个 ATM 机器,存有 5 种面值的钞票:20 ,50 ,100 ,200 和 500 美元。初始时,ATM 机是空的。用户可以用它存或者取任意数目的钱。 取款时&#xff0c…

0. 总框架

第1阶段,c语言层面 (1) c语言基本语法:结构体、指针、宏 (2) 数据结构和算法:hash,rbtree,b/btree,linked list(链表) 1.2.1-1部分数据结构的说明-CSDN博客 1.2.1-2部分数据结构的说明02_链表-CSDN博客…

比Qt更适合小公司的C++界面开发框架wxWidgets

C++行业里,如果一家小公司对某些费用方面问题特别敏感,而且你做的产品属于消费品领域,那么你最好还是选择wxWidgets来替代Qt。 Qt的好处是保罗大部分常用的开发库,它不用你会C++ STL,因为它本身就很成熟,你无需使用STL库去补充功能,所以我经常看到很多小公司的招聘信息…

源码理解 UE4中的 FCookStatsManager::FAutoRegisterCallback RegisterCookStats

官方文档:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/API/Runtime/Core/ProfilingDebugging/FCookStatsManager文档中的注释: When a cook a complete that is configured to use stats (ENABLE_COOK_STATS), it will broadcast this…

vscode如何离线安装插件

在没有网络的时候,如果要安装插件,就会麻烦一些,需要通过离线安装的方式进行。下面记录如何在vscode离线安装插件。 一、下载离线插件 在一台能联网的电脑中,下载好离线插件,拷贝到无法联网的电脑上。等待安装。 vscode插件商店地址:https://marketplace.visualstudio.co…

趋炎附势的合理性

趋炎附势常被视为负面行为,例如某个人当上了大官,之前不没有联系的人都开始联系了,为的是以后有需要帮忙的事可以找他。这样趋炎附势的行为往往令人不齿,但是仍然有一定的合理性,主要在社会资源优化配置、优质个体的选…

Android:文件管理:打开文件意图

三步走&#xff1a; 一、先在AndroidManifest.xml声明provider&#xff1a; <providerandroid:name"androidx.core.content.FileProvider"android:authorities"${applicationId}.FileProvider"android:exported"false"android:grantUriPermi…

用Tkinter制作一个用于合并PDF文件的小程序

需要安装PyPDF2库&#xff0c;具体原代码如下&#xff1a; # -*- coding: utf-8 -*- """ Created on Sun Dec 29 14:44:20 2024author: YBK """import PyPDF2 import os import tkinter as tk import windndpdf_files [] def dragged_files(f…

spring mvc源码学习笔记之四

pom.xml 内容如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

CDP集成Hudi实战-Hive

[〇]关于本文 本文测试一下使用Hive和Hudi的集成 软件版本Hudi1.0.0Hadoop Version3.1.1.7.3.1.0-197Hive Version3.1.3000.7.3.1.0-197Spark Version3.4.1.7.3.1.0-197CDP7.3.1 [一]部署Jar包 1-部署hudi-hive-sync-bundle-1.0.0.jar文件 [rootcdp73-1 ~]# for i in $(se…