当前位置: 首页 > 编程笔记 >

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

耿炎彬
2023-03-14
本文向大家介绍Java的JNI快速入门教程(推荐),包括了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快速入门教程(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 这不意味着 Electron 是绑定了 GUI 库的 JavaScript。相反,Electron 使用 web 页面作为它的 GUI,所以你能把它看作成一个被 JavaScript 控制的,精简版的 Chromium 浏览器。 主进程 在 Electron 里,运行 里 main 脚本的进程被称为主进程。在主进程运行的脚本可以以创建 web 页面的形式展示 GUI。 由于 Electron 使用

  • 本文向大家介绍docker快速入门教程,包括了docker快速入门教程的使用技巧和注意事项,需要的朋友参考一下 10分钟教会大家如何玩转Docker,这是 1、前言 进入云计算的时代,各大云提供商AWS,阿里云纷纷推出针对Docker的服务,现在Docker是十分火爆,那么Docker到底是什麽,让我们来体验一下。 2、Docker是什麽 Docker是一个开源的应用容器引擎,可以把应用以及依赖包

  • 本文向大家介绍Vue.js快速入门教程,包括了Vue.js快速入门教程的使用技巧和注意事项,需要的朋友参考一下 像AngularJS这种前端框架可以让我们非常方便地开发出强大的单页应用,然而有时候Angular这种大型框架对于我们的项目来说过于庞大,很多功能不一定会用到。这时候我们就需要评估一下使用它的必要性了。如果我们仅仅需要在一个简单的网页里添加屈指可数的几个功能,那么用Angular就太麻烦

  • 主要内容:JDBC是什么?,使用JDBC前提条件,JDBC环境设置,创建JDBC应用程序,第一个JDBC 程序实例,JDBC数据类型,JDBC批量处理,JDBC数据流JDBC是什么? JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据。JDBC代表Java数据库连接。 JDBC库中所包含的API通常与数据库使用于: 连接到数据库 创建SQL或MySQL语句 在数据库中执行SQL或MySQL查询 查看和修改数据库中的数据记录 使用JDBC前提条件 在学

  • 本文向大家介绍webpack+vue.js快速入门教程,包括了webpack+vue.js快速入门教程的使用技巧和注意事项,需要的朋友参考一下 前言 vuejs——轻量、学习成本低、双向绑定、无dom的操作、组件的形式编写 vuejs是个轻量级的mvvm框架, 集合了angular的基本功能,却又比angular更为精简,功能上涵盖了双向绑定、指令、逻辑控制、过滤器、事件监听、函数等。框架的特点使

  • 介绍如何获取服务及应用服务 1.1视频教程 1.2如何获取服务 点击试用,填写相应信息并完成邮箱激活后,您将马上拥有获得场景视频账户。 试用账号将获得基础服务的7天免费使用权。 如果您需要更多高级服务,或到期后希望购买我们的服务,您可拨打免费电话:400-660-9567,联系我们。 7天免费试用的基础服务项包括: · 批量上传 · 1G大文件上传 · 自定义播放器功能 · 统计功能 · 播放列表