文档章节

一、JNI介绍

unic0rn
 unic0rn
发布于 2016/07/14 16:21
字数 983
阅读 80
收藏 1
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
367
2
Android 深入理解 JNI(一)JNI 原理与静态、动态注册

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

刘望舒
2017/06/21
0
0
JNI Crash:异常定位与捕获处理

关键词:JNI Crash,异常检测,信号量捕获 在Android JNI开发中,经常会遇到JNI崩溃的问题,尤其带代码量大,或者嵌入了第三方代码的情况下,很难进行问题定位和处理。本文将介绍两种常见的J...

JackMeGo
07/06
0
0
Android NDK开发(七):文件的加密与解密

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

浮生若梦zp
2017/11/30
0
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.1K
3

没有更多内容

加载失败,请刷新页面

加载更多

992. Sort Array By Parity II - LeetCode

Question 992. Sort Array By Parity II Solution 题目大意:给一个int数组,一半是奇数一半是偶数,分别对偶数数和奇数数排序并要求这个数本身是偶数要放在偶数位上 思路:把奇数数和偶数数...

yysue
10分钟前
0
0
Snackbar源码分析

目录介绍 1.最简单创造方法 1.1 Snackbar作用 1.2 最简单的创建 1.3 Snackbar消失的几种方式 2.源码分析 2.1 Snackbar的make方法源码分析 2.2 对Snackbar属性进行设置 2.3 Snackbar的show显示...

潇湘剑雨
42分钟前
1
0
分布式作业系统 Elastic-Job-Lite 源码分析 —— 作业数据存储

分布式作业系统 Elastic-Job-Lite 源码分析 —— 作业数据存储 摘要: 原创出处 http://www.iocoder.cn/Elastic-Job/job-storage/ 本文基于 Elastic-Job V2.1.5 版本分享 1. 概述 本文主要分享...

DemonsI
48分钟前
1
0
jmockit demo

1、@Mocked,标识一个指定的class的实例或被测对象的参数被Mock掉。 2、@Capturing,标识一个被Mock的对象,从该对象派生的子类也被Mock了。 3、@Injectable,标识只有一个指定的被测对象的内...

我的老腰啊
今天
1
0
内容换行

用 <textarea>13611112222 这里想换行 13877779999</textarea><textarea>13611112222 13877779999</textarea>...

小黄狗
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部