安卓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全解析

相关推荐
ii_best1 天前
「安卓开发辅助工具按键精灵」xml全分辨率插件jsd插件脚本教程
android·xml·开发语言·编辑器·安卓
suki_lynn2 天前
云手机全息备份,您的数据安全“时光保险箱”
智能手机·云计算·安卓
凛_Lin~~6 天前
安卓/Java语言基础八股文
java·开发语言·安卓
凛_Lin~~6 天前
安卓 面试八股文整理(基础组件篇)
java·安卓
习惯就好zz8 天前
在 RK3588 上彻底禁用 HDMI 音频输出
音视频·rk3588·安卓·hdmi·禁用音频输出
爱跑马的程序员9 天前
Kernel i2c 设备驱动详细讲解
linux·安卓·内核驱动
私人珍藏库13 天前
【安卓】Lightroom摄影师版PS滤镜免费
android·app·安卓·工具·软件
阿桂有点桂16 天前
Flutter使用VS Code打包app
vscode·flutter·安卓
私人珍藏库17 天前
[Android] 轻小说文库(1.23)
android·app·安卓·工具
做cv的小昊17 天前
在NanoPC-T6开发板上通过USB串口通信实现光源控制功能
java·后端·嵌入式硬件·边缘计算·安卓·信息与通信·开发