最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年09月07日 10:36:06   投稿:jingxian  
下面小編就為大家?guī)硪黄狫ava的JNI快速入門教程(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

1. JNI簡介

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

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

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

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");【W(wǎng)indows下加載的就是Test2.dll,Linux下加載的是Test2.so】

II. 編譯Test.java文件

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

III. 生成Test.h文件

進入cmd輸入命令 > javah Test

Test.h文件內(nèi)容如下:

/* 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調(diào)用:JNICALL;Java_完整類名_方法名:Java_Test_helloworld;

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

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

#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()轉(zhuǎn)換Java和C之間的字符串;

2、GetStringUTFChars()和NewStringUTF(),第一個是從UTF8轉(zhuǎn)換為C的編碼格式,第二個是根據(jù)C的字符串返回一個UTF8字符串;

3、ReleaseStringUTFChars()是用來釋放對象的,在Java中有虛擬機進行垃圾回收,但是在C語言中這些對象必須手動回收,否則可能造成內(nèi)存泄漏。

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

運行結(jié)果如下:

helloworld

3. 總結(jié):

第一步:編寫帶有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快速入門教程(推薦)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java實現(xiàn)文件重命名功能

    java實現(xiàn)文件重命名功能

    這篇文章主要介紹了java實現(xiàn)文件重命名功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • hadoop?切片機制分析與應用

    hadoop?切片機制分析與應用

    切片這個詞對于做過python開發(fā)的同學一定不陌生,但是與hadoop中的切片有所區(qū)別,hadoop中的切片是為了優(yōu)化hadoop的job在處理過程中MapTask階段的性能達到最優(yōu)而言
    2022-02-02
  • SpringMVC記錄我遇到的坑_AOP注解無效,切面不執(zhí)行的解決

    SpringMVC記錄我遇到的坑_AOP注解無效,切面不執(zhí)行的解決

    這篇文章主要介紹了SpringMVC記錄我遇到的坑_AOP注解無效,切面不執(zhí)行的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 如何利用Java8 Stream API對Map按鍵或值排序

    如何利用Java8 Stream API對Map按鍵或值排序

    這篇文章主要給大家介紹了關(guān)于如何利用Java8 Stream API對Map按鍵或值排序的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Java8具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-11-11
  • 使用spring aop 統(tǒng)一捕獲異常和寫日志的示例demo

    使用spring aop 統(tǒng)一捕獲異常和寫日志的示例demo

    本文通過一個小demo給大家介紹spring AOP 實現(xiàn)的異常捕獲和日志的方法技巧,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-08-08
  • js判斷是否是移動設備登陸網(wǎng)頁的簡單方法

    js判斷是否是移動設備登陸網(wǎng)頁的簡單方法

    這篇文章主要介紹了js判斷是否是移動設備登陸網(wǎng)頁的簡單方法,需要的朋友可以參考下
    2014-02-02
  • Java Map接口及其實現(xiàn)類原理解析

    Java Map接口及其實現(xiàn)類原理解析

    這篇文章主要介紹了Java Map接口及其實現(xiàn)類原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • 最好的Java 反編譯工具的使用對比分析

    最好的Java 反編譯工具的使用對比分析

    恰好最近工作中也需要用到 Java 反編譯,所以這篇文章介紹目前常見的的幾種 Java 反編譯工具的使用,在文章的最后也會通過編譯速度、語法支持以及代碼可讀性三個維度,對它們進行測試,分析幾款工具的優(yōu)缺點,感興趣的朋友一起看看吧
    2021-05-05
  • 如何在 Java 中實現(xiàn)不可變類

    如何在 Java 中實現(xiàn)不可變類

    這篇文章主要介紹了如何在 Java 中實現(xiàn)不可變類,不變性是函數(shù)式編程的關(guān)鍵,因為它與盡量減少變化部分的這一目標相一致,這使得對這些部分的推斷更為容易一些。,需要的朋友可以參考下
    2019-06-06
  • Java利用哈夫曼編碼實現(xiàn)字符串壓縮

    Java利用哈夫曼編碼實現(xiàn)字符串壓縮

    赫夫曼編碼也翻譯為?哈夫曼編碼(Huffman?Coding),又稱霍夫曼編碼,是一種編碼方式,?屬于一種程序算法。本文將利用哈夫曼樹實現(xiàn)哈夫曼編碼進行字符串壓縮,需要的可以參考一下
    2022-09-09

最新評論

东乌珠穆沁旗| 那曲县| 邯郸县| 巴东县| 安平县| 婺源县| 昭平县| 裕民县| 绥滨县| 大理市| 商河县| 墨脱县| 安新县| 中卫市| 喀喇沁旗| 繁峙县| 石家庄市| 西青区| 丁青县| 泊头市| 和硕县| 城固县| 东兴市| 盐亭县| 江北区| 石台县| 和林格尔县| 灵山县| 诸暨市| 襄汾县| 延安市| 奉新县| 江都市| 屏边| 桑日县| 阳信县| 南平市| 康平县| 法库县| 郧西县| 西乡县|