国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

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

2019-11-26 13:52:10
字體:
來源:轉載
供稿:網友

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 __cplusplusextern "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快速入門教程(推薦)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临沭县| 桐庐县| 乌拉特前旗| 汨罗市| 兴隆县| 南阳市| 辛集市| 常熟市| 栾城县| 湟中县| 东平县| 襄城县| 洞头县| 丰都县| 凤冈县| 马山县| 莱西市| 千阳县| 贡嘎县| 宝应县| 广宗县| 吉木萨尔县| 台中市| 万全县| 平谷区| 韶关市| 盐池县| 吴堡县| 百色市| 桃园市| 噶尔县| 南丰县| 沙洋县| 桃江县| 教育| 绥棱县| 郑州市| 宁阳县| 金堂县| 翁源县| 余干县|