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

 更新时间:2016年09月07日 10:36:06   投稿:jingxian  
下面小编就为大家带来一篇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,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);
 }

备注:

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.so)。

本文运行环境:Windows 64位操作系统,JDK 1.8版本,mingw64(GCC)。

以上这篇Java的JNI快速入门教程(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Cloud 网关服务 zuul  动态路由的实现方法

    Spring Cloud 网关服务 zuul 动态路由的实现方法

    网关服务是流量的唯一入口。不能随便停服务。所以动态路由就显得尤为必要。这篇文章主要介绍了Spring Cloud 网关服务 zuul 三 动态路由的相关知识,需要的朋友可以参考下
    2019-10-10
  • 浅析SpringMVC中的适配器HandlerAdapter

    浅析SpringMVC中的适配器HandlerAdapter

    这篇文章主要介绍了SpringMVC中的适配器HandlerAdapter的相关资料,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • IntelliJ IDEA 中使用jRebel进行 Java 热部署教程图解

    IntelliJ IDEA 中使用jRebel进行 Java 热部署教程图解

    Rebel是一款JAVA虚拟机插件,它使得JAVA程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。本文通过图文并茂的形式给大家介绍了IntelliJ IDEA 中使用jRebel进行 Java 热部署教程图解,需要的朋友参考下吧
    2018-04-04
  • Java spring的三种注入方式详解流程

    Java spring的三种注入方式详解流程

    Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率
    2021-10-10
  • 关于webLucene 安装方法

    关于webLucene 安装方法

    webLucene是一个基于开源项目lucene实现站内搜索的工具,关于它的安装,百度得到的大多是一样的,按照步骤也能正确安装并运行,需要注意的问题是
    2009-06-06
  • 关于@Query注解的用法(Spring Data JPA)

    关于@Query注解的用法(Spring Data JPA)

    这篇文章主要介绍了关于@Query注解的用法(Spring Data JPA),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Idea中springboot项目的热部署无法生效问题解决

    Idea中springboot项目的热部署无法生效问题解决

    本文主要介绍了Idea中springboot项目的热部署无法生效问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10
  • httpclient的disableConnectionState方法工作流程

    httpclient的disableConnectionState方法工作流程

    这篇文章主要为大家介绍了httpclient的disableConnectionState方法工作流程源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Java实现图章或签名插在pdf的固定位置

    Java实现图章或签名插在pdf的固定位置

    使用Java技术在word转换成pdf过程中实现将图章或者签名插入在pdf中,并生成带图章或者签名的pdf,来完成某些特定场景的需求,文中有详细的代码示例,需要的朋友可以参考下
    2023-10-10
  • java集成开发SpringBoot生成接口文档示例实现

    java集成开发SpringBoot生成接口文档示例实现

    这篇文章主要为大家介绍了java集成开发SpringBoot如何生成接口文档的示例实现过程,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10

最新评论