【Java的JNI快速学习教程】
1. JNI简介
JNI是Java Native Interface的英文缩写,意为Java本地接口。
问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时性要求高的地方目前还未涉及,实时性这类话题有待考究)。
解决办法:Java使用JNI可以调用现有的本地库(C/C++开发任何和系统相关的程序和类库),极大地灵活Java的开发。
2. JNI快速学习教程
2.1 问题:
使用JNI写一段代码,实现string_Java_Test_helloworld(JNIEnv *env, jclass cls , jstring j_str)函数,实现在字符串j_str("world")前面加上hello,并返回。
2.2 解决问题过程:
I. 编写Test.java类:
public class Test{
// native interface
public native String helloworld(String text);
public static void main(String[] args){
// Load dynamic library
System.loadLibrary("Test2");
Test ts = new Test();
String text = ts.helloworld("world");
System.out.println(text);
}
}
备注:
1、加载动态类库:System.loadLibrary("Test2");【Windows下加载的就是Test2.dll,Linux下加载的是Test2.so】
II. 编译Test.java文件
进入cmd输入命令 > javac Test.java
III. 生成Test.h文件
进入cmd输入命令 > javah Test
Test.h文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Test */ #ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Test
* Method: helloworld
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_Test_helloworld
(JNIEnv *, jobject, jstring); #ifdef __cplusplus
}
#endif
#endif
备注:
1、函数声明,固定格式:JNIEXPORT;返回类型:jstring;JNI调用:JNICALL;Java_完整类名_方法名:Java_Test_helloworld;
2、函数参数:调用jni.h封装好的函数指针:JNIEnv;Java类本身:jobject,Java文件传入参数:jstring。
IV. 编写C语言文件Test2.c实现Test类调用动态链接库的功能:
#include "Test.h"
#include <string.h> JNIEXPORT jstring JNICALL Java_Test_helloworld
(JNIEnv *env, jobject obj, jstring string){
const char* str = (*env)->GetStringUTFChars(env,string,);
char cap[];
cap[] = 'h';
cap[] = 'e';
cap[] = 'l';
cap[] = 'l';
cap[] = 'o'; strcat(cap,str); (*env)->ReleaseStringUTFChars(env,string,);
return (*env)->NewStringUTF(env,cap);
}
备注:
1、由于Java本身使用了双字节字符,C语言本身都是单字节字符,所以需要使用(*env)->GetStringUTFChars()转换Java和C之间的字符串;
2、GetStringUTFChars()和NewStringUTF(),第一个是从UTF8转换为C的编码格式,第二个是根据C的字符串返回一个UTF8字符串;
3、ReleaseStringUTFChars()是用来释放对象的,在Java中有虚拟机进行垃圾回收,但是在C语言中这些对象必须手动回收,否则可能造成内存泄漏。
V. 编译和运行
编译:
进入cmd输入命令 > gcc -I "D:\Program Files\Java\jdk1.8.0_45\include" -I "D:\Program Files\Java\jdk1.8.0_45\include\win32" --share Test2.c -o Test2.dll
运行:
进入cmd输入命令 > java Test
运行结果如下:
helloworld
3. 总结:
第一步:编写带有native方法的Java类(Test.java),使用javac工具编译Java类(生成Test.class);
第二步:使用javah生成与native方法对应的头文件(Test.h);
第三步:使用C/C++实现相应的头文件(Test2.c),并编译为动态链接库(Test2.dll)。
本文运行环境:Windows 64位操作系统,JDK 1.8版本,mingw64(GCC)。
4. 参考:
http://www.cnblogs.com/icejoywoo/archive/2012/02/22/2363709.html
【转载本文章请备注原地址出处:http://www.cnblogs.com/eesijian/p/5843879.html 】
【Java的JNI快速学习教程】的更多相关文章
- 【Java线程池快速学习教程】
1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
- Java线程池快速学习教程
1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
- 阿里巴巴Java开发手册快速学习
Java作为一门名副其实的工业级语言,语法友好,学习简单,大规模的应用给代码质量的管控带来了困难,特别是团队开发中,开发过程中的规范会直接影响最终项目的稳定性. 善医者“未有形而除之”,提高工程健壮性 ...
- Java核心编程快速学习
Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体内容如下图所示. 反射reflect是理解Java语言工作原理的基础,Java编译器首先需要将我们编写的 ...
- Java并发编程快速学习
上周的面试中,被问及了几个关于Java并发编程的问题,自己回答的都不是很系统和全面,可以说是"头皮发麻",哈哈.因此果断购入<Java并发编程的艺术>一书,学习后的体会 ...
- Java核心编程快速学习(转载)
http://www.cnblogs.com/wanliwang01/p/java_core.html Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体 ...
- MATLAB数据处理快速学习教程
转自:http://blog.csdn.net/abcjennifer/article/details/7706581 本篇内容集合了MATLAB中的基本操作.数据存储与计算.数据的直线与曲线拟合与画 ...
- 数据结构和算法(Java版)快速学习(线性表)
线性表的基本特征: 第一个数据元素没有前驱元素: 最后一个数据元素没有后继元素: 其余每个数据元素只有一个前驱元素和一个后继元素. 线性表按物理存储结构的不同可分为顺序表(顺序存储)和链表(链式存储) ...
- 数据结构和算法(Java版)快速学习(数组Array)
Java数组 在Java中,数组是用来存放同一种数据类型的集合,注意只能存放同一种数据类型. 用类封装数组实现数据结构 数据结构必须具有以下基本功能: ①.如何插入一条新的数据项 ②.如何寻找某一特定 ...
随机推荐
- ASP.NET的分页方法(二)
第二讲主要使用到了常用的分页控件aspnetpager,这里对他就行一个简单的应用,具体大家可以到杨涛的博客上去寻找相关的DLL, 首先要先引用AspNetPager.dll,然后把这个DLL同时添加 ...
- GC:垃圾回收器简介
Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK ...
- SqlAgent备份脚本
) ) set @dbname='emcp' set @back_path= 'e:\'+@dbname+'\'+@dbname ),) )) )) )) +'.bak' exec('use ['+@ ...
- [转]C语言文件输入/输出ACM改进版(freopen函数)
C语言文件输入/输出ACM改进版(freopen函数) 2009年5月27日 10:379,457 浏览数发表评论阅读评论 文章作者:姜南(Slyar) 文章来源:Slyar Home (www. ...
- C# —— IList, ArrayList与List的区别详解
共同点: IList, List , ArrayList 通俗一点来讲就是广义的数组,C#里面称之为集合.不同于一般的狭义的数组,它们可以存放任意类型的东西,在申明或者赋值的时候指定. 比如你写 ...
- Linux 上的基础网络设备详解
抽象网络设备的原理及使用 网络虚拟化是 Cloud 中的一个重要部分.作为基础知识,本文详细讲述 Linux 抽象出来的各种网络设备的原理.用法.数据流向.您通过此文,能够知道如何使用 Linux 的 ...
- JobScheduler
任务写在JobService中 public class TestJobService extends JobService { private static final String TAG = & ...
- jquery动态创建form并提交到.ashx文件处理
有时候在写web 应用的时候,需要临时动态构造一个form 并提交,form 里面的参数以及action,以及是post请求还是get请求,甚至form 的样式都是可以指定的,用原生的java ...
- CSS的魔法和魅力
其实我最开始学会的语言是HTML,我记得那还是大一的事情.当时我对床的兄弟DR放了一本HTML的书在床上,我因为没事就拿来看看.那本书大概只有50页左右,可是可以说如果没有这本书,今天Maybe我不会 ...
- shader 语言 【转】
shader语言 3dlabs改名后其开发者网站关闭 可以在这里下载shadergen http://3dshaders.com/home/index.php?option=com_weblinks& ...