一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java的JNI快速入門教程(推薦)

Java的JNI快速入門教程(推薦)

2020-06-12 14:18jingxian JAVA教程

下面小編就為大家?guī)硪黄狫ava的JNI快速入門教程(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

1. JNI簡介

JNI是Java Native Interface的英文縮寫,意為Java本地接口。

問題來源:由于Java編寫底層的應用較難實現(xiàn),在一些實時性要求非常高的部分Java較難勝任(實時性要求高的地方目前還未涉及,實時性這類話題有待考究)。

解決辦法:Java使用JNI可以調用現(xiàn)有的本地庫(C/C++開發(fā)任何和系統(tǒng)相關的程序和類庫),極大地靈活Java的開發(fā)。

2. JNI快速學習教程

2.1 問題:

使用JNI寫一段代碼,實現(xiàn)string_Java_Test_helloworld(JNIEnv *env, jclass cls , jstring j_str)函數(shù),實現(xiàn)在字符串j_str("world")前面加上hello,并返回。

2.2 解決問題過程:

I. 編寫Test.java類:

?
1
2
3
4
5
6
7
8
9
10
11
12
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、加載動態(tài)類庫:System.loadLibrary("Test2");【Windows下加載的就是Test2.dll,Linux下加載的是Test2.so】

II. 編譯Test.java文件

進入cmd輸入命令 > javac Test.java

III. 生成Test.h文件

進入cmd輸入命令 > javah Test

Test.h文件內容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* 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、函數(shù)聲明,固定格式:JNIEXPORT;返回類型:jstring;JNI調用:JNICALL;Java_完整類名_方法名:Java_Test_helloworld;

2、函數(shù)參數(shù):調用jni.h封裝好的函數(shù)指針:JNIEnv;Java類本身:jobject,Java文件傳入參數(shù):jstring。

IV. 編寫C語言文件Test2.c實現(xiàn)Test類調用動態(tài)鏈接庫的功能:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#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本身使用了雙字節(jié)字符,C語言本身都是單字節(jié)字符,所以需要使用(*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++實現(xiàn)相應的頭文件(Test2.c),并編譯為動態(tài)鏈接庫(Test2.so)。

本文運行環(huán)境:Windows 64位操作系統(tǒng),JDK 1.8版本,mingw64(GCC)。

以上這篇Java的JNI快速入門教程(推薦)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 九九99靖品 | 青青自拍视频 | 欧洲女同同性videos0 | 91成人免费观看 | 国外欧美一区另类中文字幕 | 韩国三级年轻小的胰子完整 | 国产高清在线精品一区二区 | yellow在线 | 无码人妻丰满熟妇啪啪网不卡 | 波多野结衣两女调教 | 五月天色网站 | 欧美精品v日韩精品v国产精品 | 美女被免费视频 | 亚洲欧美日韩久久一区 | 亚洲香蕉伊在人在线观看9 亚洲系列国产系列 | 热99re久久精品国产 | 水野朝阳厨房系列在线观看 | 香蕉精品国产高清自在自线 | 性色香蕉AV久久久天天网 | 成年人免费在线看 | 国产自拍啪啪 | blacked黑人| 亚洲国产精品自产在线播放 | 婷色| 高肉h护士办公室play | 18日本xxxxxxⅹxx96 | 息与子中文字幕完整在线 | 国产欧美国产综合第一区 | free性泰国娇小videos | 亚洲国产日韩欧美mv | 欧美一级欧美三级在线 | 免费一级毛片在线播放 | 久久综合色超碰人人 | 亚洲va天堂va国产va久久 | 国产成人免费a在线资源 | 草草在线免费视频 | 免费av在线看 | 日本一二线不卡在线观看 | 日本三级免费观看 | 欧美午夜性春猛交bbb | 国产xxxxxx久色视频在 |