Android学习之NDK开发

2024-08-28 16:48
文章标签 android 学习 开发 ndk

本文主要是介绍Android学习之NDK开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JNI

Java Native Interface(Java 本地编程接口),一套编程规范.提供了若干的 API 实现了 Java 和其他语言的通信(主要是 C/C++)。

Java 可以通过 JNI 调用本地的 C/C++ 代码,本地的 C/C++ 代码也可以调用 java 代码。

Java 通过 C/C++ 使用本地的代码的一个关键性原因在于 C/C++ 代码的高效性。

NDK

Native Development Kit(本地开发工具),一系列工具的集合.

提供了一系列的工具,帮助开发者快速开发 C/C++,极大地减轻了开发人员的打包工作。

一、安装所需工具

1、 打开Android Studio,找到SDK Manager

2、在SDK Manager的SDK Tools找到CMake、LLDB、NDK选中下载安装。

安装完成后就可以在File->Project Structure->SDK Location中就看到Android NDK location中看到安装好的ndk路径。

NDK也可以不在此下载安装,也可以自行去官网下载,然后手动配置Android NDK location的路径,比如:D:\test\android-ndk-r14b

NDK:这套工具集允许为 Android 使用 C 和 C++ 代码。

CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果只计划使用 ndk-build,则不需要此组件。

LLDB:一种调试程序,Android Studio 使用它来调试原生代码。

简单介绍一个CMake:

从AndroidStudio2.2以上就添加了Cmake方式来编译NDK代码。默认是使用Cmake方式来编译。可以节省大量的工作。CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程),能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。

二、使用

在所需的工具安装完成后,就可以创建一个项目来进行测试。

1、新建一个 project,在填写Application Name的时候勾选Include C++ support复选框,然后一直next到finish创建出项目。

2、项目创建完成后就可以看到比普通项目多了一些内容:

    src/main/cpp文件夹是用来存放C/C++源码CMakeLists.txt:CMake 脚本配置文件app/build.gradle文件中也多了一些内容

接下来介绍一下多出的东西:

(1) app/build.gradle

android {...defaultConfig {...externalNativeBuild {cmake {cppFlags ""}ndk {   //设置CPU平台,默认是没有的,表示生成所有平台的so,也可以针对单一平台设置abiFilters "arm64-v8a"}}}buildTypes {...}externalNativeBuild {cmake {   //表示CMakeLists文件路径path "CMakeLists.txt"}}
}	

(2) CMakeLists.txt

# 指定cmke版本  
cmake_minimum_required(VERSION3.4.1)  
# add_library()命令用于向CMake添加依赖源文件或库  
# 指令需传入三个参数(函数库名称、库类型、依赖源文件相对路径)  
add_library(  # 生成函数库的名称,即libnative-lib.so或libnative-lib.a(lib和.so/.a默认缺省)  native-lib  # 生成库类型:动态库为SHARED,静态库为STATIC  SHARED  # 依赖的c/cpp文件(相对路径)  src/main/cpp/native-lib.cpp 
)  
# find_library()命令用于定位NDK中的库  
# 需传入两个参数(path变量、ndk库名称)  
find_library(  # 设置path变量的名称,这里为NDK中的日志库  log-lib  #指定cmake查询库的名称  #即在ndk开发包中查询liblog.so函数库,将其路径赋值给log-lib  log 
)  
#target_link_libraries()命令用于指定要关联到的原生库的库  
target_link_libraries(# 指定目标库,与上面指定的函数库名一致  native-lib  # 链接的库,根据log-lib变量对应liblog.so函数库  ${log-lib} 
)这是默认生成的CMakeLists文件,除此之外CMakeLists文件还有一些其他的设置:#头文件的加载 ,括号内是.h文件路径
include_directories(src/main/cpp/include)#set 设置变量,方便使用,设置一个变量DIR,路径为${CMAKE_SOURCE_DIR}/libs。${CMAKE_SOURCE_DIR}表示的是CMakeLists.txt所在的目录。
set(DIR ${CMAKE_SOURCE_DIR}/libs)#变量的使用
${DIR}#加载第三方动态库
CMakeLists文件中默认加载c原文件的方式,针对第三方动态库的加载配置如下:第一种 是在main目录下新建jniLibs目录,并将so文件放在其中。以“libavcodec-57.so”为例add_library( avcodec-57 SHARED IMPORTED)set_target_properties( avcodec-57PROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavcodec-57.so)${ANDROID_ABI}就是表示各种平台,armeabi或x86。add_library( xx ) “配置加载动态库的方式 avcodec-57”动态库的名称,“SHARED ”表示加载的是动态库。set_target_properties(xx)配置加载动态库的路径可以把相同的路径设置为变量DIR,使得配置如下:set(DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/)add_library( avcodec-57 SHARED IMPORTED)set_target_properties( avcodec-57PROPERTIES IMPORTED_LOCATION${DIR}/libavcodec-57.so)第二种 放置到libs目录,这种方式与第一种的区别就是需要在build.gradle中配置加载路径。其他一样。在app/build.gradle中配置加载路径:android {...sourceSets {main {jniLibs.srcDirs = ['libs']}}}最后依然需要进行链接target_link_librarie,在target_link_librarie添加动态库的名称。#设置生成的so动态库最后输出的路径	set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})	默认不用设置,会将生成的so打入到apk中,如果需要将so文件给第三方使用,可以设置,这样就可以在jinLibs文件夹下看到生成的so文件了。

<3> 在项目构建完成后,可以看到src/main/cpp文件夹下看到默认生成了一个native-lib.cpp的C++文件,返回了一个String类型。

此时运行就可以在界面看到返回的内容。这样一个简单的ndk开发就完成了,只需要配置好CMakeLists.txt文件即可。

这篇关于Android学习之NDK开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115327

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo