Java的JNI快速入门教程(推荐)
1.JNI简介
JNI是JavaNativeInterface的英文缩写,意为Java本地接口。
问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时性要求高的地方目前还未涉及,实时性这类话题有待考究)。
解决办法:Java使用JNI可以调用现有的本地库(C/C++开发任何和系统相关的程序和类库),极大地灵活Java的开发。
2.JNI快速学习教程
2.1问题:
使用JNI写一段代码,实现string_Java_Test_helloworld(JNIEnv*env,jclasscls,jstringj_str)函数,实现在字符串j_str("world")前面加上hello,并返回。
2.2解决问题过程:
I.编写Test.java类:
publicclassTest{ //nativeinterface publicnativeStringhelloworld(Stringtext); publicstaticvoidmain(String[]args){ //Loaddynamiclibrary System.loadLibrary("Test2"); Testts=newTest(); Stringtext=ts.helloworld("world"); System.out.println(text); } }
备注:
1、加载动态类库:System.loadLibrary("Test2");【Windows下加载的就是Test2.dll,Linux下加载的是Test2.so】
II.编译Test.java文件
进入cmd输入命令>javacTest.java
III.生成Test.h文件
进入cmd输入命令>javahTest
Test.h文件内容如下:
/*DONOTEDITTHISFILE-itismachinegenerated*/ #include<jni.h> /*HeaderforclassTest*/ #ifndef_Included_Test #define_Included_Test #ifdef__cplusplus extern"C"{ #endif /* *Class:Test *Method:helloworld *Signature:(Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORTjstringJNICALLJava_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> JNIEXPORTjstringJNICALLJava_Test_helloworld (JNIEnv*env,jobjectobj,jstringstring){ constchar*str=(*env)->GetStringUTFChars(env,string,0); charcap[128]; cap[0]='h'; cap[1]='e'; cap[2]='l'; cap[3]='l'; cap[4]='o'; strcat(cap,str); (*env)->ReleaseStringUTFChars(env,string,0); 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:\ProgramFiles\Java\jdk1.8.0_45\include"-I"D:\ProgramFiles\Java\jdk1.8.0_45\include\win32"--shareTest2.c-oTest2.dll
运行:
进入cmd输入命令>javaTest
运行结果如下:
helloworld
3.总结:
第一步:编写带有native方法的Java类(Test.java),使用javac工具编译Java类(生成Test.class);
第二步:使用javah生成与native方法对应的头文件(Test.h);
第三步:使用C/C++实现相应的头文件(Test2.c),并编译为动态链接库(Test2.so)。
本文运行环境:Windows64位操作系统,JDK1.8版本,mingw64(GCC)。
以上这篇Java的JNI快速入门教程(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。