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

相关推荐
茜茜西西CeCe3 小时前
移动技术开发:简单计算器界面
java·gitee·安卓·android-studio·移动技术开发·原生安卓开发
茜茜西西CeCe17 小时前
移动技术开发:登录注册界面
java·gitee·gradle·android studio·安卓·移动技术开发·原生安卓开发
我命由我123452 天前
ADB 之 logcat 极简小抄(过滤日志、保存日志到文件)
android·运维·adb·android studio·安卓·运维开发·android-studio
振华OPPO2 天前
我的5周年创作纪念日,不忘初心,方得始终。
android·java·android studio·安卓·安卓app
我命由我123453 天前
MAC 地址简化概念(有线 MAC 地址、无线 MAC 地址、MAC 地址的随机化)
android·学习·计算机网络·安卓·学习方法
程序者王大川5 天前
【前端】Flutter vs uni-app:性能对比分析
前端·flutter·uni-app·安卓·全栈·性能分析·原生
我命由我123456 天前
Kotlin 极简小抄 P2(插值表达式、运算符、选择结构赋值)
android·java·开发语言·后端·kotlin·安卓
帅得不敢出门7 天前
安卓framework美化手势导航侧滑返回UI
android·java·ui·framework·安卓·开发·定制
淡水猫.7 天前
Fake Location模拟定位,刷跑 “运动世界校园”
安卓
我命由我123458 天前
4-4.Andorid Camera 之简化编码模板(获取摄像头 ID、选择最优预览尺寸)
android·java·java-ee·android studio·安卓·android-studio