安卓native编程

目录

JNI

1、JNI概述、作用

01-深入理解JNI

简介JNI的概念和作用,解释JVM保证java代码能够跨平台兼容的原因,jni动态库的加载流程,简介了jni函数的注册方法(静态注册的劣势,动态注册的方法)

详解JNI到底是什么

简介JNI实现Java调用到native语言的主要流程;JNI函数声明中各部分内容的介绍和作用;不同平台上动态链接库类型;简单的Java代码示例实现JNI调用,包括javac指令生成JNI头文件,gcc环境安装搭建,动态库生成等。

JNI的适用场景、NDK、动态库和静态库
JNI基础简介

那什么场景下可能会用到JNI呢?

1、需要提升性能时,比如说做一些底层的开发,例如音视频处理之类的,通常都会用到JNI。

2、增加破解难度,例如需要提升代码的保护级别,需要将一些敏感信息放到底层隐藏起来。

3、需要使用到一些较为成熟的底层C/C++库时。

NDK:Native Development Kit

要在安卓上使用JNI就需要用到NDK,NDK是一系列工具的集合,它提供了一系列的工具,帮助开发者快速使用C/C++代码,能够交叉编译生成可在安卓系统上运行的动态库或者静态库。例如我们想要将基于C的音视频处理库FFmpeg移植到安卓平台上使用的话就需要用到NDK进行交叉编译。

动态库、静态库:

静态库:静态库是指在链接阶段,编译器将汇编生成的.o目标文件与库文件一起链接打包到可执行文件中,或者说一起链接生成最后的可执行文件。因此对应的链接方式称为静态链接。

因为静态库是在编译期间连接库文件的,所以静态库存在着可执行文件体积较大,更新维护不方便 等问题。

动态库:动态库又叫共享库,或动态链接库。动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入,不同的应用程序如果要调用同一个库,在内存中只需要有一份该共享库即可,这样就规避了空间浪费的问题。而且动态库是在程序运行时才被载入,所以相对静态库来说动态库还具有更新、部署方便等优点。

正因为动态库的这些优点,所以目前的大多数的SDK普遍采用动态库的方式。

JNI函数:

JNI函数声明中各部分的介绍和作用。

2、静态注册、动态注册

JNI知识总结

静态注册的劣势?

动态注册的时机?动态注册其实就是在java层加载JNI动态库的时候,调用大JNI_OnLoad函数,需要在该函数中将JNI函数指针注册到JVM中。

静态JNI方法和实例JNI方法的区别?区别在第二个参数,普通的JNI方法对应的JNI函数的第二个参数是jobject类型,而静态的JNI方法对应的JNI函数的第二个参数是jclass类型

JNIEnv的认识:和线程有一一对应关系。

如何在JNI函数中通过JNIEnv操作jobject,常见的函数有哪些类别?

jstring和C++字符串之间的转换?

JNI函数签名的规范?

JNI中对象的垃圾回收机制?三种引用方式?

如何实现JNI调用Java函数呢?必须先使用JVM对象(在JNI_OnLoad中传入,所有native线程仅此一份),将当前线程和JVM对象绑定,获得当前线程的JNIEnv,然后调用JNIEnv相关接口完成调用。

Android JNI知识点总结
主要解释JNIEnv和JVM关系,JNI调用流程,动态注册、静态注册方法,数据类型转换。

JNIEXPORT关键字作用:JNIEXPORT 这个关键字说明这个函数是一个可导出函数,C/C++ 库里面的函数有些可以直接被外部调用,有些不可以,原因就是每一个C/C++库都有一个导出函数列表,只有在这个列表里面的函数才可以被外部直接调用,类似Java的public函数和private函数的区别。 JNI层必须实现为动态库的形式,这样Java虚拟机才能加载它并调用它的函数。

JNICALL作用:说明这个函数是一个JNI函数,用来和普通的C/C++函数进行区别,实际发现不加这个关键字,Java也是可以调用这个JNI函数的。

3、数据转换、函数签名

JNI技术简介

为什么需要设计函数签名?Java语言有函数重载,仅依赖函数名无法确定唯一的JNI函数。

JNI函数签名的规范?

JNI详解

如何在native中访问assets内容

Android: 在native中访问assets全解析

相关推荐
普马萨特1 天前
Wi-Fi 扫描频率多层限制机制解析
网络协议·安卓
ᴀᴠɪᴄɪɪ ғᴏʀᴇᴠᴇʀ3 天前
WebHomeTV:把 Android 影音盒子变成一个可编程的网页应用平台
app·安卓·智能tv·tv box·webtv
百度搜知知学社4 天前
抖音双模块架构:兼容全安卓版本并支持登录
android·架构·安卓·登录·兼容性·抖音
暗冰ཏོ6 天前
Flutter 从入门到项目实战:Dart 基础、跨平台开发、App 架构与上线发布完整指南
flutter·架构·app·安卓·应用开发
UnicornDev8 天前
Android 开发入门教程(第三十五篇):Compose 中的 Material Design 3 —— 构建现代化 UI 的完整组件库
安卓
UnicornDev8 天前
Android 开发入门教程(第三十四篇):Compose 中的图像与图标 —— 从基础显示到性能优化
安卓
上天_去_做颗惺星 EVE_BLUE12 天前
Ubuntu Android 虚拟机安装使用教程
android·linux·测试工具·ubuntu·安卓
我命由我1234512 天前
Android 开发问题:Could not find com.github.PicnicSupermarket:FingerPaintView:1.2.
android·github·android studio·安卓·android jetpack·android-studio·android runtime
Andy Wee13 天前
红米K40 BootLoader 解锁完整教程(避坑版)
安卓
vensli14 天前
消息跨端架构演进:基于 C++ 的多端一致性研发框架实践
java·人工智能·软件工程·安卓