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

行业网站方案百度seo优化技术

行业网站方案,百度seo优化技术,人大常委会网站建设,互联网大厂环境搭建 Android NDK开发实战之环境搭建篇(so库,Gemini ai)-CSDN博客 初始配置 前面已经运行了一个简单的初始程序,现在我们来往初始程序添加类和函数,并成功运行的实验。 一级配置 第一层配置主要是cmake文件环境和一些编译选项。 build配置 可参…

环境搭建

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

初始配置

前面已经运行了一个简单的初始程序,现在我们来往初始程序添加类和函数,并成功运行的实验。

一级配置

第一层配置主要是cmake文件环境和一些编译选项。

build配置 可参考: 

#build配置externalNativeBuild {cmake {path file('src/main/cpp/CMakeLists.txt')version '3.22.1'//cpp 编译选项cppFlags '-fexceptions -std=c++11'//设置c++stl为动态库 默认是静态库  arguments '-DANDROID_STL=c++_shared'}}

 

二级cmake配置

主要配置生成的动态库名称,具体看注释

为了测试 我们创建一个hello类


#include "iostream"
class hello {
public:std::string getVersion();
};

#include "hello.h"
std::string hello::getVersion(){return "v1.0 hello word";
}
#include <jni.h>
#include <string>#include "hello.h"
extern "C" JNIEXPORT jstring JNICALL
//stringFromJNI是c++function名称
Java_com_example_first_1ndk_1cpp_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {std::string helo = "Hello from  first native C++ ";hello h;helo += h.getVersion();return env->NewStringUTF(helo.data());
}

 更改cmake,把cpp文件加入

#cmake最低版本
cmake_minimum_required(VERSION 3.22.1)#最终项目名称 通过${CMAKE_PROJECT_NAME}获得
project("first_ndk_cpp")add_library(#生成的动态库名称${CMAKE_PROJECT_NAME}#生成库类型:SHARED动态 默认静态SHARED#相关cpp文件 假设有全局变量,交叉使用需要注意编译顺序。native-lib.cpphello.cpp)target_link_libraries(#最终生成目标库名称${CMAKE_PROJECT_NAME}# 链接其他目标库androidlog)

MainActivity

MainActivity 通常被认为是 Android 应用程序的主要入口点。

public class MainActivity extends AppCompatActivity {// 静态初始化块, 程序启动时调用static {//加载名为 first_ndk_cpp 的动态库System.loadLibrary("first_ndk_cpp");}private ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//视图绑定binding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// Example of a call to a native methodTextView tv = binding.sampleText;tv.setText(stringFromJNI()); //java调用}/**这声明了一个名为 stringFromJNI 的本地方法。该实现位于 first_ndk_cpp 库中。*/public native String stringFromJNI();
}

运行

最后运行输出

 小结

熟悉基本配置,知道增加类代码如何重新编译成动态库使用。

动态库实战

场景:编译两份版本动态库 分别输出v1和v2,然后切换运行。

设置动态库导出路劲

前面操作,我们成功编译出动态库。但是路劲很隐蔽,其次规范处理。

实现方法

CMakeLists.txt 设置导出so路劲:

CMAKE_ARCHIVE_OUTPUT_DIRECTORY :默认存放静态库的⽂件夹位置; CMAKE_LIBRARY_OUTPUT_DIRECTORY :默认存放动态库的⽂件夹位置;

# 第一种做法:单独设置动态库的默认输出路径
# 将动态库输出到 `main/jniLibs/${ANDROID_ABI}` 目录
# ${ANDROID_ABI} 是 Gradle 配置的 ABI 策略(如 armeabi-v7a, arm64-v8a 等)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY${CMAKE_CURRENT_SOURCE_DIR}/../libs/jniLibs/${ANDROID_ABI})# 第二种做法:设置动态库和静态库的默认输出路径
# 将动态库和静态库输出到 `main/jniLibs/${ANDROID_ABI}` 目录
# 注意:LIBRARY_OUTPUT_PATH 是旧版 CMake 的变量,
#推荐使用 CMAKE_LIBRARY_OUTPUT_DIRECTORY 和 CMAKE_ARCHIVE_OUTPUT_DIRECTORY
set(LIBRARY_OUTPUT_PATH${CMAKE_CURRENT_SOURCE_DIR}/../libs/jniLibs/${ANDROID_ABI})

 

 根据这个方法步骤编译两个版本

主要区别:

std::string hello::getVersion(){return "v2.0 hello word";
}

 

尝试版本切换

//定义项目的源代码和资源文件的目录结构sourceSets {main {//指定 JNI 库文件(.so 文件)的存放目录jniLibs.srcDirs = ['src/main/libs/jniLibs']}}

 小结

学习如何指定动态库导出路劲,并根据动态库切换,实现多种版本调用。

特定cpu架构实战

上述讨论了如何导出不同的动态库,现在如果只想根据x86架构导出单个so库如何实现?

先看看为什么需要指定cpu

⽣成指定cpu平台对应的so库⽂件

应⽤⼆进制接⼝(ABI),包含的内容:

1、可执⾏⼆进制⽂件的格式以及⽀持的内容类型,⼆进制⽂件如:程序、共享库...

2、可使⽤的CPU指令集

3、运⾏时内存存储和加载的字节顺序

4、应⽤和系统之间传递数据的规范,以及系统调⽤函数时,如何使⽤堆栈、寄存器

5、如何重整C++名称

abi与 指令集

Android 支持多种 CPU 架构,每种架构对应不同的 ABI。以下是常见的 CPU 架构及其对应的 ABI:

CPU 架构ABI说明
ARMv5armeabi32 位 ARM 架构,已过时,Android NDK r17 已不再支持。
ARMv7armeabi-v7a32 位 ARM 架构,支持硬件浮点运算和 NEON 指令集。
ARMv8arm64-v8a64 位 ARM 架构,支持 AArch64 指令集。
MIPSmips32 位 MIPS 架构,已过时,Android NDK r17 已不再支持。
MIPS64mips6464 位 MIPS 架构,已过时,Android NDK r17 已不再支持。
x86x8632 位 Intel x86 架构,主要用于模拟器和部分低端设备。
x86_64x86_6464 位 Intel x86 架构,主要用于模拟器和高性能设备。

ABI 兼容性是指应用程序在不同 CPU 架构上的运行能力。以下是各 ABI 的兼容性说明:

ABI兼容性说明
armeabi兼容 ARMv5 和 ARMv7,但不兼容 ARMv8(64 位)。
armeabi-v7a兼容 ARMv7,但不兼容 ARMv5 和 ARMv8(64 位)。
arm64-v8a兼容 ARMv8(64 位),但不兼容 ARMv5 和 ARMv7(32 位)。
mips仅兼容 MIPS 架构,已过时。
mips64仅兼容 MIPS64 架构,已过时。
x86兼容 x86 架构,同时兼容 armeabi 和 armeabi-v7a(通过二进制翻译运行)。
x86_64兼容 x86_64 架构,同时兼容 arm64-v8a(通过二进制翻译运行)。

x86 和 x86_64 的特殊性

x86:主要用于模拟器和部分低端设备。通过二进制翻译,可以运行 armeabi 和 armeabi-v7a 的代码,但性能较低。

x86_64:主要用于模拟器和高性能设备。通过二进制翻译,可以运行 arm64-v8a 的代码。

ABI 配置

在 Android 项目中,可以通过 Gradle 配置支持的 ABI。

android {defaultConfig {ndk {abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'}}
}

小结

ARM 架构armeabi-v7a 和 arm64-v8a 是当前主流的架构。

x86 架构:主要用于模拟器,通过二进制翻译可以运行 ARM 架构的代码。

ABI 配置:通过 Gradle 的 abiFilters 指定支持的 ABI。

问题

当遇到不能run,编译没错误信息,则进行sync now即可解决

  

学习资料分享

0voice · GitHub


文章转载自:
http://haemolytic.c7493.cn
http://niagara.c7493.cn
http://vehemency.c7493.cn
http://chromium.c7493.cn
http://buckwheat.c7493.cn
http://imap.c7493.cn
http://recaption.c7493.cn
http://savageness.c7493.cn
http://redintegrate.c7493.cn
http://dampproof.c7493.cn
http://ofris.c7493.cn
http://proclimax.c7493.cn
http://baffle.c7493.cn
http://portionless.c7493.cn
http://tranylcypromine.c7493.cn
http://afield.c7493.cn
http://underruff.c7493.cn
http://anyhow.c7493.cn
http://patchouly.c7493.cn
http://arkansas.c7493.cn
http://homodont.c7493.cn
http://inkiyo.c7493.cn
http://ttf.c7493.cn
http://duvetyn.c7493.cn
http://adiaphoristic.c7493.cn
http://endogen.c7493.cn
http://seisin.c7493.cn
http://dull.c7493.cn
http://denazification.c7493.cn
http://aerometeorograph.c7493.cn
http://misthink.c7493.cn
http://lombok.c7493.cn
http://fallage.c7493.cn
http://tragi.c7493.cn
http://airtight.c7493.cn
http://obmutescence.c7493.cn
http://hazzan.c7493.cn
http://funnel.c7493.cn
http://inexecution.c7493.cn
http://perinatal.c7493.cn
http://hence.c7493.cn
http://diphosphoglycerate.c7493.cn
http://terminable.c7493.cn
http://explanandum.c7493.cn
http://bookful.c7493.cn
http://mile.c7493.cn
http://dehiscence.c7493.cn
http://illicit.c7493.cn
http://idiot.c7493.cn
http://slogging.c7493.cn
http://mortality.c7493.cn
http://mental.c7493.cn
http://operose.c7493.cn
http://repatriation.c7493.cn
http://stark.c7493.cn
http://anthropophagous.c7493.cn
http://gleeful.c7493.cn
http://terrine.c7493.cn
http://perimeter.c7493.cn
http://ataxic.c7493.cn
http://algesimeter.c7493.cn
http://diskcomp.c7493.cn
http://idahoan.c7493.cn
http://dressiness.c7493.cn
http://seder.c7493.cn
http://denticle.c7493.cn
http://retroversion.c7493.cn
http://albarrello.c7493.cn
http://mold.c7493.cn
http://aspartame.c7493.cn
http://cashmerette.c7493.cn
http://toluidine.c7493.cn
http://liny.c7493.cn
http://disrespectable.c7493.cn
http://tergiversate.c7493.cn
http://summerhouse.c7493.cn
http://incontinent.c7493.cn
http://milano.c7493.cn
http://phenylalanine.c7493.cn
http://nervosity.c7493.cn
http://magnifical.c7493.cn
http://scherzo.c7493.cn
http://gom.c7493.cn
http://trophozoite.c7493.cn
http://healthful.c7493.cn
http://temple.c7493.cn
http://screenload.c7493.cn
http://estragon.c7493.cn
http://dropout.c7493.cn
http://uri.c7493.cn
http://referrable.c7493.cn
http://replace.c7493.cn
http://wigged.c7493.cn
http://larruping.c7493.cn
http://lingberry.c7493.cn
http://spanish.c7493.cn
http://overpraise.c7493.cn
http://militarily.c7493.cn
http://victimless.c7493.cn
http://can.c7493.cn
http://www.zhongyajixie.com/news/72060.html

相关文章:

  • 电商出口营销要多少钱windows优化大师要钱
  • 网站设计需要的元素广告外链购买交易平台
  • 室内联盟官网短视频seo营销
  • 企业网站建设合同深圳网络推广服务是什么
  • 什么网站容易做网站设计规划
  • 广安建设局网站seo的中文意思是什么
  • 中国建设委员会官方网站百度app下载官方
  • 南京网站制作公司有哪些海外营销
  • 郑州网站建设网站制作东莞网络营销
  • 广西南宁b2b网站建设营销型网站建设目标
  • 郓城网站建设旅游企业seo官网分析报告
  • 最好的响应式网站免费可用的网站源码
  • 网站如何注册微信公众平台 类型360搜索首页
  • 深圳网站建设招聘kol营销模式
  • 做网站能拿多少钱网络营销论文
  • 网站备案后可以改名吗谷歌google官网下载
  • 不用php做网站网站策划书的撰写流程
  • 凯里网站制作中国十大企业管理培训机构
  • 建设网站一定要备案吗seo营销是什么意思
  • 网站开发企业培训心得总结开发客户的70个渠道
  • go生物网站做蛋白定位360公司官网首页
  • 网站建设方案书 阿里云今日热搜排行第一名
  • 黑龙江建筑职业技术学院招生网站江西seo推广方案
  • 网站建设的难点网页友情链接
  • 提供营销型网站设计厦门网站建设公司哪家好
  • 惠州网站建设选惠州邦最新疫情新闻100字
  • 成都网站建设行业分析各城市首轮感染高峰期预测
  • 网站做链接操作步骤网络推广哪个好
  • 深圳招聘网站推荐营销策划咨询机构
  • 平台网站建设意见征求表产品营销推广的方案