程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java的JNI疾速入門教程(推舉)

Java的JNI疾速入門教程(推舉)

編輯:關於JAVA

Java的JNI疾速入門教程(推舉)。本站提示廣大學習愛好者:(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疾速入門教程(推舉)就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved