Android JNI入坑之旅:JNI的简单介绍

Posted 冷锋SJ记忆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android JNI入坑之旅:JNI的简单介绍相关的知识,希望对你有一定的参考价值。

1.JNI简介

JNI全称为Java Native Interface;

从Java1.1开始,JNI就成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互;

并非从Android发布才引入JNI的概念的。

2.什么是NDK?

NDK全称为native development kit本地语言(C&C++)开发包;

NDK提供了一些交叉编译工具链和android自带的库;

这些Android的库可以让开发者在编写本地语言的程序时调用;

而NDK提供的交叉编译工具链就对已经编写好的C&C++代码进行编译,生成库。

3.JNI的基本调用流程

1).Android应用层以Java为基础,.java文件在被编译成.dex文件后必须要通过Dalvik虚拟机( Virtual Machine)来执行;

2).执行过程中如果需要用到本地方法(即C/C++函数库),Dalvik则去加载C/C++本地函数库(System.loadLibrary("libName"););

注意:由于C/C++本地函数库并不运行在Dalvik虚拟机中,所以效率和速度都相对较快;

3).Dalvik虚拟机加载C/C++函数库成功之后会自动地寻找库里面的JNI_OnLoad函数(关于JNI_OnLoad函数后面会有详细说明);

4).虚拟机释放C/C++函数库时,与JNI_OnLoad函数相对应的JNI_OnUnLoad函数会被调用,用以处理善后清除工作。

4.关于JNI_OnLoad函数的一些说明

1).告知Dalvik虚拟机该C/C++函数库使用哪一个JNI版本;

2).库中没有该函数时默认使用JNI1.1版本;

3).新版JNI在功能上有很多的扩展,想要使用这些新功能必须在JNI_OnLoad()函数中声明JNI的版本:

1 result = JNI_VERSION_1_4;

4).库中没有JNI_OnLoad()函数时,Android调试信息会给出"No JNI_OnLoad found"的提示;

5).C/C++函数库加载完成后首先调用JNI_OnLoad()方法,可以在该方法中进行一些初始化工作,如注册JNI函数等等(可加快调用效率和速度);

以上是关于Android JNI入坑之旅:JNI的简单介绍的主要内容,如果未能解决你的问题,请参考以下文章

Android开发实践:Java层与Jni层的数组传递

Java JNI机制

Android中关于JNI 的学习简单的样例,温故而知新

Android中关于JNI 的学习简单的样例,温故而知新

我的C语言学习进阶之旅介绍一下NDK开发中关于JNI函数的两种注册方式:静态注册和动态注册

我的C语言学习进阶之旅介绍一下NDK开发中关于JNI函数的两种注册方式:静态注册和动态注册