文档章节

一、JNI介绍

unic0rn
 unic0rn
发布于 2016/07/14 16:21
字数 983
阅读 322
收藏 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

unic0rn

粉丝 9
博文 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
433
2
JNI Crash:异常定位与捕获处理

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

JackMeGo
2018/07/06
0
0
Java关键字(二)——native

  本篇博客我们将介绍Java中的一个关键字——native。   native 关键字在 JDK 源码中很多类中都有,在 Object.java类中,其 getClass() 方法、hashCode()方法、clone() 方法等等都是用 ...

osc_0sz5p35w
2018/03/11
43
0
Android NDK开发(七):文件的加密与解密

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

浮生若梦zp
2017/11/30
0
0
Android 深入理解 JNI(一)JNI 原理与静态、动态注册

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

刘望舒
2017/06/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

1M带宽服务器并发数可支撑多少人同时在线?

服务器1M公网带宽能同时承受多少人同时在线?很多云厂商如阿里云、腾讯云推出的很多服务器活动默认配置1M带宽,很多站长认为服务器1M带宽小水管,事实上服务器1M带宽支撑日均2000IP的网站是够...

码笔记
11分钟前
14
0
C#简单入门——适合初学入门

一、第一个C#程序 using System;namespace HelloWorldApplication // 命名空间声明{ /* 类名为 HelloWorld */ class HelloWorld // 一个 class { /* main函数 ...

ittzg
14分钟前
9
0
DDD之2领域概念

图中是暗黑领域,非常牛逼的技能。 背景 DDD中出现的名词: 领域,子领域,核心域,通用域,支撑域,限界上下文,聚合,聚合根,实体,值对象 都是关键概念,但是又比较晦涩,在开始DDD之前,...

李福春carter
17分钟前
12
0
Vue基础学习备忘

内置指令 v-bind v-model v-if/v-else/v-show v-for v-on v-text v-html v-el v-ref v-pre v-cloak v-once 过滤器 作用是对数据再次加工,例如:后台返回时间戳,vue通过过滤器进行数据格式化...

Apache软件基金会主席
22分钟前
26
0
使用Git版本控制查看文件的更改历史记录 - View the change history of a file using Git versioning

问题: How can I view the change history of an individual file in Git, complete details with what has changed? 如何在Git中查看单个文件的更改历史记录,完整的详细信息? I have got......

技术盛宴
25分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部