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

相关推荐
hello world smile1 天前
Flutter常用命令整理
android·flutter·移动开发·android studio·安卓
潘帕斯的雄鹰4 天前
【1个月速成Java】基于Android平台开发个人记账app学习日记——第4天,注册登录逻辑代码
java·学习·安卓·自定义安卓app图标
jingling5558 天前
Android系统架构
android·arm开发·系统架构·安卓
qiuqiushuibx11 天前
安卓基础001
安卓
第三女神程忆难12 天前
Android Kotlin 高阶函数详解及其在协程中的应用
android·开发语言·kotlin·移动开发·安卓·高阶函数·1024程序员节
x02414 天前
Android Room(SQLite) too many SQL variables异常
sqlite·安卓·android jetpack·1024程序员节
惜.己14 天前
Appium环境搭建全流程(含软件)
python·测试工具·node.js·appium·pytest·安卓·1024程序员节
shandianchengzi16 天前
【记录】Android|安卓平板 猫游戏(四款,peppy cat,含下载教程和链接)
android·游戏·安卓·平板·cat··tablet
jingling55516 天前
adb常见指令以及问题解决
开发语言·功能测试·测试工具·adb·安卓
jingling55516 天前
adb安装,连接模拟器以及常见指令
开发语言·功能测试·测试工具·adb·安卓