一、什么是JNI?

看下百度百科怎么说的:

JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境。

简单点来说就是:

1.JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C和C++)
2.通过JNI可以实现java和本地代码之间相互调用
3.jni可以看做是翻译 实际上就是一套协议

二、为什么要用JNI?

在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能,如下:

1)标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的(只能由其他语言编写)。

2)你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的。

3)程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们。

4)为了应用的安全性,会将一些复杂的逻辑和算法通过本地代码(C或C++)来实现,本地代码比字节码难以破解。

三、怎么用JNI?

JNI开发流程主要分为以下6步:

1)、编写声明了native方法的Java类
2)、将Java源代码编译成class字节码文件
3)、用javah -jni命令生成.h头文件(javah是jdk自带的一个命令,-jni参数表示将class中用native声明的函数生成jni规则的函数)
4)、用本地代码实现.h头文件中的函数
5)、将本地代码编译成动态库(windows:*.dll,linux/unix:*.so,mac os x:*.jnilib)
6)、拷贝动态库至 java.library.path 本地库搜索目录下,并运行Java程序

四、什么是JNA?

JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna)。JNA提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。

五、JNI与JNA

JNI优点:效率高

JNA调用C/C++函数效率高

JNI缺点:繁琐

我们知道,使用JNI调用.dll/.so共享类库是非常非常麻烦和痛苦的。

如果有一个现有的.dll/.so文件,如果使用JNI技术调用,我们首先需要另外使用C语言写一个.dll/.so共享库,使用SUN规定的数据结构替代C语言的数据结构,调用已有的  dll/so中公布的函数。

然后再在Java中载入这个适配器dll/so,再编写Java   native函数作为dll中函数的代理。

经过2个繁琐的步骤才能在Java中调用本地代码。

因此,很少有Java程序员愿意编写调用dll/.so库中的原生函数的java程序。这也使Java语言在客户端上乏善可陈。可以说JNI是Java的一大弱点!

JNA优点:简单

JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll,Android的so)而不需要编写任何Native/JNI代码。开发人员只要在一个Java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。

JNA缺点:性能损失

使用JNA技术比使用JNI技术调用动态链接库会有些微的性能损失。可能速度会降低十几倍

JNI系列(一)JNI简介相关推荐

  1. android jni java call c字符串乱码,JNI系列入门之C语言中文字符串乱码问题

    JNI系列文章: 解决方案 思路: 我们在写java代码的时候,可以通过new String(byte[], String chasetname)来指定字符集加载,避免乱码问题.同样我们可以利用JNI ...

  2. Android JNI学习(四)——JNI的常用方法的API

    前三篇主要讲解了jni基础相关的理论知识,今天主要讲解一下JNI的常用方法的API,掌握了基本的理论知识和常用的API接下来才能更好的实战. jni的常用API大纲 再看API前,我建议大家主要结合官 ...

  3. Oracle系列之add_months简介以及用法归纳教程

    Oracle系列之add_months简介以及用法归纳教程 最近遇到一个SQL统计,需要遇到获取某个日期n个月后的日期,比如统计入职时间超过2年的员工信息 如果不依靠Oracle函数,自己去写有点麻烦 ...

  4. openGauss数据库源码解析系列文章--openGauss简介(一)

    openGauss数据库是华为深度融合在数据库领域多年经验,结合企业级场景要求推出的新一代企业级开源数据库.此前,Gauss松鼠会已经发布了openGauss数据库核心技术系列文章,介绍了openGa ...

  5. 嵌入式USB开发系列(1):USB简介

    嵌入式USB开发系列(1):USB简介 文章目录 嵌入式USB开发系列(1):USB简介 1. USB的优势 2. USB协议标准 3. USB通信接口 声明 声明:USB资料网站 链接,相关协议和文 ...

  6. 《快乐星猫》动漫系列主要角色简介

    <快乐星猫>动漫系列 主要角色简介 姓名:星猫 特性:幽默风趣 个性:来自天神星的魔法大师,外型酷似地球上的猫.无所不知,却常常闹笑话.体形看来笨笨的,但非常敏捷,说话喜欢用说教的口气. ...

  7. JNI系列(1):基础篇

    由于现在的项目及以后的项目将大量使用JNI调用,故打算做一则系列文章供参考及讨论.本文是关于JNI的基础知识. JNI是Java代码与本地代码交互的桥梁,有两种方式:(1)在Java中加载动态链接库 ...

  8. jni java共享变量_Android JNI开发系列(十)JNI访问 Java 实例变量和静态变量

    JNI访问 Java 实例变量和静态变量 Java 中的实例变量和静态变量,在本地代码中如何来访问和修改.静态变量也称为类变量(属性),在所有实例对象中共享同一份数据,可以直接通过类名.变量名来访问. ...

  9. android jni 调用java_Android JNI开发系列(九)JNI调用Java的静态方法实例方法

    JNI调用Java的静态方法&实例方法 package org.professor.jni.bean; import android.util.Log; /** * Created by pe ...

最新文章

  1. SpringMVC之使用Validator接口进行验证
  2. 如何解决虚拟机频繁分离和附加磁盘导致的识别错误
  3. openstack——使用命令行发放云主机
  4. git在实际开发中的应用
  5. Mesos Framework开发指南 一
  6. Linux视频 pad,Wine 1.9.10 发布下载, 改善视频输出
  7. 【linux高级程序设计】(第八章)进程管理与程序开发 4
  8. 转:js中arguments详解
  9. linux变utf8为sjis命令,【通译】PHP中 文字编码变换时 使用SJIS-win而非SJIS,使用eucJP-win而非EUC-JP...
  10. mysql数据库接收不了中文乱码_mysql数据库 中文乱码
  11. 立帖为据,每日学习一课编程技术
  12. tensorflow pb模型获得权重wts
  13. Feb16 小白《Linux就该这么学》学习笔记3
  14. TGBUS主页面 HTML的编写
  15. 一本书读懂大数据 读书笔记(1)
  16. (示例3)涂涂乐开发教程
  17. JavaScript面向对象学习深拷贝、浅拷贝(三)
  18. minikube addons enable ingress 启动错误
  19. PC用PSV游戏下载工具NPS_Browser+本地缓存文件
  20. MySQL存储引擎 优化 索引问题

热门文章

  1. verilog 中的冒泡排序法
  2. 深入理解JVM4:内存结构篇(方法区)
  3. python脱离pc自动化_Android手机脱离电脑直接运行UIAutomator2
  4. java:程序包XXX不存在
  5. rpm安装Mysql的rpm包,提示/bin/sh is needed by MySql.rpm 错误的问题解决
  6. 小学计算机教师业务笔记,信息技术教师业务学习笔记
  7. 安装python的pip相关
  8. 扫描仪怎样装无线网络服务器,扫描仪(7140)安装说明
  9. STM32 | C语言对寄存器的封装
  10. asp.net c# 通过消息队列处理高并发请求(以抢小米手机为例)