文档章节

一、JNI介绍

unic0rn
 unic0rn
发布于 2016/07/14 16:21
字数 983
阅读 85
收藏 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层各有一个库,即libmedia_jni.so和libmedia.so,其中libmedia.so完成实际的功...

peng_cc
2014/04/21
398
2
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
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

没有更多内容

加载失败,请刷新页面

加载更多

即学即用,轻松搞定这些选择器!(上)

所谓基本选择器是指选择器的名称前面没有其他选择器,即在组成上,基本选择器是单一名称。 基本选择器主要包括: 元素选择器 ID 选择器 类选择器 伪类选择器 伪元素选择器 通用选择器 元素选...

我的卡
12分钟前
2
0
c直接操作JAVA中的数组

** * jni对数组运算 * 在C中没有创建新的数组副本,直接在原来的java数组上面修改。然后返回了jintArray类型数据 */ JNIEXPORT jintArray JNICALL Java_com_org_vincent_javacallc_JNI_incr...

whoisliang
21分钟前
2
0
简单理解闭包问题

从我16年开始接触前端,知道闭包这个词,已经过去两年了。这两年里,闭包这个概念我在很多地方了解过,却实在没有真的理解,久而久之,变成了一块心病。这不,趁着现在项目告一段落的时间,我...

IrisHuang
21分钟前
3
0
网站漏洞怎么修复对于thinkphp的漏洞修复

THINKPHP漏洞修复,官方于近日,对现有的thinkphp5.0到5.1所有版本进行了升级,以及补丁更新,这次更新主要是进行了一些漏洞修复,最严重的就是之前存在的SQL注入漏洞,以及远程代码执行查询系...

网站安全
22分钟前
1
0
docker 安装oracle11g

1.准备docker环境; 2. docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g --pull 镜像(6个多G) 3.docker run -d -p 1521:1521 -v /data/oracle:/data/oracle --name ora......

xiaoxin
22分钟前
1
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部