源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Java的JNI快速入门教程(推荐)

  • 时间:2022-12-27 13:37 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java的JNI快速入门教程(推荐)
[b]1. JNI简介[/b] JNI是Java Native Interface的英文缩写,意为Java本地接口。 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时性要求高的地方目前还未涉及,实时性这类话题有待考究)。 解决办法:Java使用JNI可以调用现有的本地库(C/C++开发任何和系统相关的程序和类库),极大地灵活Java的开发。 [b]2. JNI快速学习教程[/b] [b]2.1 问题:[/b] 使用JNI写一段代码,实现string_Java_Test_helloworld(JNIEnv *env, jclass cls , jstring j_str)函数,实现在字符串j_str("world")前面加上hello,并返回。 [b]2.2 解决问题过程:[/b] 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);
  }
}
[b]备注:[/b] 1、加载动态类库:System.loadLibrary("Test2");【Windows下加载的就是Test2.dll,Linux下加载的是Test2.so】 [b]II. 编译Test.java文件[/b] 进入cmd输入命令 > javac Test.java [b]III. 生成Test.h文件[/b] 进入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
[b]备注:[/b] 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,0);
  char cap[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);
 }
[b]备注:[/b] 1、由于Java本身使用了双字节字符,C语言本身都是单字节字符,所以需要使用(*env)->GetStringUTFChars()转换Java和C之间的字符串; 2、GetStringUTFChars()和NewStringUTF(),第一个是从UTF8转换为C的编码格式,第二个是根据C的字符串返回一个UTF8字符串; 3、ReleaseStringUTFChars()是用来释放对象的,在Java中有虚拟机进行垃圾回收,但是在C语言中这些对象必须手动回收,否则可能造成内存泄漏。 V. 编译和运行 编译: 进入cmd输入命令 > gcc -I "D:Program FilesJavajdk1.8.0_45include" -I "D:Program FilesJavajdk1.8.0_45includewin32" --share Test2.c -o Test2.dll 运行: 进入cmd输入命令 > java Test 运行结果如下: helloworld [b]3. 总结:[/b] 第一步:编写带有native方法的Java类(Test.java),使用javac工具编译Java类(生成Test.class); 第二步:使用javah生成与native方法对应的头文件(Test.h); 第三步:使用C/C++实现相应的头文件(Test2.c),并编译为动态链接库(Test2.so)。 本文运行环境:Windows 64位操作系统,JDK 1.8版本,mingw64(GCC)。 以上这篇Java的JNI快速入门教程(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程素材网。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部