JNI技术基础(1)——从零开始编写JNI代码
众所周知,Java程序的最大特点就是其跨平台的特性,编写的上层应用程序可以不加任何修改甚至不用重新编译而运行于不同的平台上,然而,Java本身也存着这一个弊端,那就是性能上相对要差一些,在对性能要求比较高的场合,Java程序往往有些力不从心。为了弥补这个缺陷,Java提供了一个叫做JNI的接口技术,Java程序可以通过JNI调用C/C++的库,这对于那些对性能要求比较高的Java程序而言无疑是一个福音。
JNI(Java nativeinterface)可译为Java原生接口,是用来使Java代码能够调用C/C++代码的一种机制。JNI的强大特性使我们在使用JAVA平台的同时,还可以重用原来的本地代码。作为虚拟机实现的一部分,JNI允许JAVA和本地代码间的双向交互。
但是,有一点必须明确,那就是使用JNI也是有代价的。大家都知道Java程序是运行在Java虚拟机JVM之上的,故而可以做到平台无关。但是如果Java程序通过JNI调用了原生的代码(比如c/c++等),则Java程序就丧失了平台无关性。最起码需要重新编译原生代码部分。所以使用JNI需要好好权衡,不到万不得已,请不要选择JNI,可以选择替代方案,比如TCP/IP进行进程间通讯等等。这也是为什么谷歌的Android平台的底层虽然用JNI实现,但是他不建议开发人员用JNI来开发Android上面的应用的原因。因为使用JNI将会丧失Android上面的应用程序平台无关性。
为了能够循序渐进的学习,本文仅仅讨论基于标准Java平台的JNI代码的编写,教JNI的初次接触者能够快速编写出最简单的JNI代码,体验JNI开发的流程。
下面就跟我一起一步一步学习如何使用JNI技术。
研究JNI我认为最好的方法就是从例子入手,就从众所周知的HelloWorld入手吧。
下面我就用JNI实现一个经典的“HelloWorld”程序,该程序在Java中通过JNI调用c函数实现“HelloWorld”的输出。
创建该程序分为以下步骤:
①.创建一个Java程序(HelloWorld.java)定义原生的c/c++函数
②.用javac编译HelloWorld.java生成HelloWorld.class
③.用javah带-jni参数编译HelloWorld.class生成HelloWorld.h文件,该文件中定义了c的函数原型。在实现c函数的时候需要
④.创建HelloWorld.c,实现HelloWorld.h定义的函数
⑤.编译HelloWorld.c生成libHelloWorld.so
⑥.在java虚拟机运行java程序HelloWorld
1.创建Java源程序文件HelloWorld.java
public class HelloWorld{
private native void print();
public static void main(String[] args){
new HelloWorld().print();
}
static {
System.loadLibrary("HelloWorld");
}
}
对上面代码进行简单说明:
①.private native void print()语句只是个函数的声明,而函数的实现并没有在java代码中,关键字native告诉编译器该方法实在本地实现的,我们可以使用该关键字声明一些方法,然后将该方法在本地以C/C++等语言实现并按特定格式编译成动态库,供java程序调用;
②.在本地实现的函数编译成动态库之后,java程序如何识别并加载?后面的static代码段正是实现这个功能,其中的HelloWorld便是动态库的名字,按照动态库的加载规则,我们编译的动态库全名应该为libHelloWorld.so。(待续)
JNI技术基础(1)——从零开始编写JNI代码的更多相关文章
- JNI技术基础(2)——从零开始编写JNI代码
书接上文: <JNI技术基础(1)——从零开始编写JNI代码> 2.编译源程序HelloWorld.java并生成HelloWorld.class 3.生成头文件HelloWorld.h ...
- 技术转载:Jni学习四:如何编写jni方法
转载:http://blog.chinaunix.net/u1/38994/showart_1099528.html 一.概述: 在这篇文章中将会简单介绍如何编制一些简单的JNI 方法.我们都知道JN ...
- Android Studio1.4.x JNI开发基础-基本环境配置
从Eclipse时代到Android Studio普及,开发工具越来越好用.早些时候还需要安装Cygwin工具,从Android Studio1.3以后,在Android 环境开发JNI程序搭建开发环 ...
- 【转】Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在And ...
- 【Android高级】NDK/JNI编程技术基础介绍
作为一个Andoird的Java程序猿,会受到Java语言的局限.由于作为一面门向对象的语言不能像C/C++那样轻易调用与硬件有关的操作.因此JNI就搭建了这样一个桥梁,使Java和C/C++语言之间 ...
- [转][android][利用JNI技术在Android中调用、调试C++代码]
在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在Android中会生成Linux系统下的.so文件(好吧,其实我基本没用过Linux). 没写过 ...
- Android JNI编程(八)——体验AS2.2.2编写Jni程序、Java调C、C调Java函数、将C代码中的Log打印至Logcat
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 不得不说在AS2.2以上的版本进行开发就一个字——爽,在2.0上使用jni出 ...
- windows和linux环境下java调用C++代码-JNI技术
最近部门做安卓移动开发的需要调C++的代码,困难重重,最后任务交给了我,查找相关资料,没有一个教程能把不同环境(windows,linux)下怎么调用说明白的,自己在实现的过程中踩了几个坑,在这里总结 ...
- 使用jni技术进行android应用签名信息核查及敏感信息保护
近期业余时间写了一款应用<摇啊摇>,安智.安卓.360等几个应用商店已经陆续审核通过并上线.从有想法到终于将产品做出来并公布,断断续续花了近二个半月的业余时间,整体来讲还算顺 ...
随机推荐
- (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- background-orgin属性
重点内容是:背景的显示范围是在元素的内边距之内的,如果要想改变显示范围,可以使用background-orgin和background-clip进行调整. (1)background-orgin有三个 ...
- Swift 遍历数组元素
..<Array.count { Array[index] } for (index, element) in Array.enumerate() { print(("\(index+ ...
- Java 读取Properties配置文件
1.img_url.properties imgurl=http://10.1.19.65:8090 2.Test.java InputStream inputStream = this.getCla ...
- CentOS6.4完全安装FFmpeg手记
鼓捣媒体的人对FFmpeg应该不会陌生,它不仅功能强大,结构优美,灵活.易扩展,也是很其他多媒体播放器的基础,例如VLC,Mplayer等等,还有好多商业播放器都用了ffmpeg,但这些商业软件却没有 ...
- mybatis 关联查询 association
<resultMap id="DutyPersonAndFileAndScoreMap" type="com.cares.asis.duty.entity.Duty ...
- picurl
from lxml import etreeimport requestsdef getHtml(html): novelcontent = requests.get(html).content re ...
- 6本Android开发必备图书
学习一样新事物或许有多种方式,报培训班,看视频,向高手请教等等,但一本好书往往可以让你少走很多弯路,事半功倍.今天与大家分享一些Android开发值得一读的书籍,希望对新手安卓开发者们有所帮助. 1. ...
- linux ps命令
名称:ps 使用权限:所有使用者 使用方式:ps [options] [--help] 说明:显示瞬间行程 (process) 的动态 参数: ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍 ...
- CSS3中:nth-child和:nth-of-type的区别深入理解
关于:nth-child和:nth-of-type的区别之前一直没太注意.最近打算深入了解一些CSS3,才发现里面其实暗藏玄机. :nth-child可以选择父元素下的字元素,:nth-of-type ...