文档章节

一、JNI介绍

unic0rn
 unic0rn
发布于 2016/07/14 16:21
字数 983
阅读 71
收藏 1
点赞 0
评论 6
jni
  1. 什么是JNI
  2. 为什么要使用JNI?
    1. 效率高
    2. 代码复用
  3. JNI带来的副作用

 

1.什么是JNI

        JNI(Java Native Interface) Java本地调用接口,它提供了若干的API实现了Java与其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准就成为了Java平台的一部分。

2.为什么要使用JNI?

    1)效率高

        在大多情况下,我们使用Java开发程序,但在一些对效率要求极高如音视频编解码的场景下,Java由于虚拟机的原因可能无法满足我们对性能的要求。而C或者C++的执行效率比Java快上几十倍,我们希望能使用C或C++来完成耗费效率的模块,让Java调用它完成业务功能。

    2)代码复用

        例如C对音视频处理的库,都是比较成熟的,在各方面的性能上都会比Java优越,如果通过JNI能使用C的库,那么意义上就是Java复用C的代码,极大节省了使用纯Java重新开发的时间。或者本身公司旧项目使用C,新项目可以复用之前的项目代码。

        还有一种情况是,例如你的项目需要完成一个获取cpu序列号的功能,但是你翻遍了api文档也没能找到可以调用的方法,这个情况下,你就可以考虑使用jni来完成。毕竟c的编程灵活性比java高许多。

 

3.JNI带来的副作用

        JNI并非绝对的有益无害。

    1)程序可移植性变差

        Java本身是在JVM上运行,可以跨Linux、windows、Mac各种平台运行,无需重新编译。而使用了JNI后,就依赖于本地调用,使程序的移植性大大降低。例如C,即使遵循POSIX标准也需要在目标平台重新编译才能让程序可以在Windows和Linux下运行。

    2)程序稳定性可能降低

        使用了JNI后,程序不再是绝对安全的,如果本地代码(C或C++)没有处理好,一旦发生异常将可能导致整个JVM崩溃,所以使用JNI处理需对本地代码(C或C++)十分熟悉,否则放在生产环境下时不时的出现问题又难以调试十分麻烦。

 

        在我的实际工作中,便碰到了如上所述的问题:我负责开发的是一个防盗报警系统,所有终端设备需要接入到系统中统一管理,有的设备是带摄像头的。当时分工是,我一个写C的同事负责设备控制和视频转发模块,我负责使用java调用他的模块进行业务处理,我java和他c的交互便使用到jni。这个项目使用jni明显的好处是,C模块网络编程处理这些设备的控制和视频转发效率十分高,但是十分严重的缺点也暴露了出来,开发调试十分不便,而且jni一旦报错会导致整个tomcat直接crash,无法对用户再提供服务,所以使用jni开发的时候要异常小心。现在系统正准备从windows平台迁移到linux平台,可是由于同事c编程的时候依赖了windows的api,导致无法直接迁移,目前只能等待同事将修改成遵循posix标准后才能进行平台移植。

 

 加我QQ:981656164,共同学习交流,记得备注 —— OSC!  ~~ <( ̄3 ̄)> 

© 著作权归作者所有

共有 人打赏支持
unic0rn
粉丝 8
博文 76
码字总数 36275
作品 1
泉州
项目经理
加载中

评论(6)

小盒子_java

引用来自“大爱阳哥”的评论

引用来自“小盒子_java”的评论

引用来自“大爱阳哥”的评论

图片叠加在视频上的函数?我不太明白你的意思
就是第三方提供的台标机上叠加图片的一个函数,我用java通过jni调用,javac javaah 然后自己写了个dll, 最后测试 这个函数执行过程需要1.2秒左右

java通过jni调用c速度是很快的,花了1.2秒应该是图片叠加函数处理时间占了大部分
好的,明白了,谢谢
unic0rn
unic0rn

引用来自“小盒子_java”的评论

引用来自“大爱阳哥”的评论

图片叠加在视频上的函数?我不太明白你的意思
就是第三方提供的台标机上叠加图片的一个函数,我用java通过jni调用,javac javaah 然后自己写了个dll, 最后测试 这个函数执行过程需要1.2秒左右

java通过jni调用c速度是很快的,花了1.2秒应该是图片叠加函数处理时间占了大部分
小盒子_java

引用来自“大爱阳哥”的评论

图片叠加在视频上的函数?我不太明白你的意思
就是第三方提供的台标机上叠加图片的一个函数,我用java通过jni调用,javac javaah 然后自己写了个dll, 最后测试 这个函数执行过程需要1.2秒左右
unic0rn
unic0rn

引用来自“小盒子_java”的评论

有个问题请教哈 我在使用jni调用c++的动态库的时候,有一个图片叠加在视频上的函数,而这个函数在java中的执行过程是大概1.2秒,正常吗?

图片叠加在视频上的函数?我不太明白你的意思
unic0rn
unic0rn
图片叠加在视频上的函数?我不太明白你的意思
小盒子_java
有个问题请教哈 我在使用jni调用c++的动态库的时候,有一个图片叠加在视频上的函数,而这个函数在java中的执行过程是大概1.2秒,正常吗?
关于深入理解JNI疑惑

@邓凡平 你好,想跟你请教个问题:最近在看您的《深入理解Android:卷一》,在第二章讲JNI处您写道JNI层和Native层各有一个库,即libmediajni.so和libmedia.so,其中libmedia.so完成实际的功能...

peng_cc ⋅ 2014/04/21 ⋅ 2

Android 深入理解 JNI(一)JNI 原理与静态、动态注册

前言 JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层。这一个系列我们来一起深入学习JNI。 1.JNI概述 Android系统按...

刘望舒 ⋅ 2017/06/21 ⋅ 0

Android NDK开发(七):文件的加密与解密

前言 基于C++学习和JNI流程学习,相信大家对NDK开发充满了期待,本篇博客将从一个简单的例子入手,带着大家熟悉NDK开发。 文件的加密与解密 创建Java文件: 创建cpp文件,加密核心实现: CM...

浮生若梦zp ⋅ 2017/11/30 ⋅ 0

android源码-深入理解JNI技术

9/5/2016 2:10:30 PM android源码-深入理解JNI技术 本章涉及的源代码文件名及位置 AndroidRunTime.cpp (framework/base/core/jni/AndroidRunTime.cpp)JNIHelp.c (libnativehelper/JNIHelp.c)......

小米墨客 ⋅ 2016/09/07 ⋅ 3

[深入理解Android卷一 全文-第二章]深入理解JNI

由于《深入理解Android 卷一》和《深入理解Android卷二》不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在OSC博客中全文转发这两本书的全部内容。 第2章 深入理解JNI 本章...

邓凡平 ⋅ 2015/08/02 ⋅ 0

开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用

如何设置您的NDK应用 本篇主要介绍NDK应用的开发步骤,调试流程已经如何为英特尔架构设置您的NDK应用。 相关文章 •1. 开发兼容英特尔架构的Android应用(一) 应用架构介绍 •2. 开发兼容英特...

LiSteven ⋅ 2013/08/07 ⋅ 0

深入理解JNI

深入理解JNI 本章主要内容 · 通过一个实例,介绍JNI技术和在使用中应注意的问题。 本章涉及的源代码文件名及位置 下面是本章分析的源码文件名及其位置。 · MediaScanner.java framework/ba...

xiaole0313 ⋅ 2016/03/31 ⋅ 0

卸载Android app弹出浏览器的一种实现

卸载Android应用程序时,经常会弹出网页,做些用户数据的调查统计。Android是可以获取到其它应用被卸载掉这个事件,但是并不能获取自身被卸载这个事件。从纯粹的java层是没法实现的,本文介绍...

jacksonke ⋅ 2015/08/25 ⋅ 2

Android深入理解JNI(二)类型转换、方法签名和JNIEnv

相关文章 Android深入理解JNI系列 前言 上一篇文章介绍了JNI的基本原理和注册,这一篇接着带领大家来学习JNI的数据类型转换、方法签名和JNIEnv。 1.数据类型的转换 首先给出上一篇文章中and...

刘望舒 ⋅ 2017/07/03 ⋅ 0

Android JNI学习(三)——Java与Native相互调用

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头 ⋅ 05/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 27分钟前 ⋅ 0

Spring JavaConfig 注解

JavaConfig注解允许开发者将Bean的定义和配置放在Java类中。它是除使用XML文件定义和配置Bean外的另一种方案。 配置: 如一个Bean如果在XML文件可以这样配置: <bean id="helloBean" class="...

霍淇滨 ⋅ 34分钟前 ⋅ 0

Spring clound 组件

Spring Cloud技术应用从场景上可以分为两大类:润物无声类和独挑大梁类。 润物无声,融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon,客户端负载均衡,特性有区域亲和、重试机制。...

英雄有梦没死就别停 ⋅ 36分钟前 ⋅ 0

Confluence 6 重新获得站点备份文件

Confluence 将会创建备份,同时压缩 XML 文件后存储熬你的 <home-directory>/backups> 目录中。你需要自己访问你安装的 Confluence 服务器,并且从服务器上获得这个文件。 运行从 Confluence...

honeymose ⋅ 40分钟前 ⋅ 0

informix的常用SQL语句

1、创建数据库 eg1. 创建不记录日志的库testdb,参考语句如下: CREATE DATABASE testdb; eg2. 创建带缓冲式的记录日志的数据库testdb(SQL语句不一定在事务之中,拥有者名字不被用于对象的解...

wangxuwei ⋅ 56分钟前 ⋅ 0

matplotlib画图

最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数。 from pylab import *from numpy import *x = linspace(0, 5, 10)y = x ** 2figure()plot(x, y, 'r')...

Dr_hu ⋅ 今天 ⋅ 0

RabbitMQ学习以及与Spring的集成(三)

本文介绍RabbitMQ与Spring的简单集成以及消息的发送和接收。 在RabbitMQ的Spring配置文件中,首先需要增加命名空间。 xmlns:rabbit="http://www.springframework.org/schema/rabbit" 其次是模...

onedotdot ⋅ 今天 ⋅ 0

JAVA实现仿微信红包分配规则

最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。 算法介绍 一、红包金额限制 对于微...

小致dad ⋅ 今天 ⋅ 0

Python 数电表格格式化 xlutils xlwt xlrd的使用

需要安装 xlutils xlwt xlrd 格式化前 格式化后 代码 先copy读取的表格,然后按照一定的规则修改,将昵称中的学号提取出来替换昵称即可 from xlrd import open_workbookfrom xlutils.copy ...

阿豪boy ⋅ 今天 ⋅ 0

面试题:使用rand5()生成rand7()

前言 读研究生这3 年,思维与本科相比变化挺大的,这几年除了看论文、设计方案,更重要的是学会注重先思考、再实现,感觉更加成熟吧,不再像个小P孩,人年轻时总会心高气傲。有1 道面试题:给...

初雪之音 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部