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

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

 更新時(shí)間:2016年09月07日 10:36:06   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇Java的JNI快速入門(mén)教程(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

1. JNI簡(jiǎn)介

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

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

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

2. JNI快速學(xué)習(xí)教程

2.1 問(wèn)題:

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

2.2 解決問(wèn)題過(guò)程:

I. 編寫(xiě)Test.java類(lèi):

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、加載動(dòng)態(tài)類(lèi)庫(kù):System.loadLibrary("Test2");【W(wǎng)indows下加載的就是Test2.dll,Linux下加載的是Test2.so】

II. 編譯Test.java文件

進(jìn)入cmd輸入命令 > javac Test.java

III. 生成Test.h文件

進(jìn)入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;返回類(lèi)型:jstring;JNI調(diào)用:JNICALL;Java_完整類(lèi)名_方法名:Java_Test_helloworld;

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

IV. 編寫(xiě)C語(yǔ)言文件Test2.c實(shí)現(xiàn)Test類(lèi)調(diào)用動(dòng)態(tài)鏈接庫(kù)的功能:

#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語(yǔ)言本身都是單字節(jié)字符,所以需要使用(*env)->GetStringUTFChars()轉(zhuǎn)換Java和C之間的字符串;

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

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

V. 編譯和運(yùn)行

編譯:

進(jìn)入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

運(yùn)行:

進(jìn)入cmd輸入命令 > java Test

運(yùn)行結(jié)果如下:

helloworld

3. 總結(jié):

第一步:編寫(xiě)帶有native方法的Java類(lèi)(Test.java),使用javac工具編譯Java類(lèi)(生成Test.class);

第二步:使用javah生成與native方法對(duì)應(yīng)的頭文件(Test.h);

第三步:使用C/C++實(shí)現(xiàn)相應(yīng)的頭文件(Test2.c),并編譯為動(dòng)態(tài)鏈接庫(kù)(Test2.so)。

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

以上這篇Java的JNI快速入門(mén)教程(推薦)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

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

    hadoop?切片機(jī)制分析與應(yīng)用

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

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

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

    如何利用Java8 Stream API對(duì)Map按鍵或值排序

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

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

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

    js判斷是否是移動(dòng)設(shè)備登陸網(wǎng)頁(yè)的簡(jiǎn)單方法

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

    Java Map接口及其實(shí)現(xiàn)類(lèi)原理解析

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

    最好的Java 反編譯工具的使用對(duì)比分析

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

    如何在 Java 中實(shí)現(xiàn)不可變類(lèi)

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

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

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

最新評(píng)論

万盛区| 仁布县| 双牌县| 勐海县| 遵义县| 铜山县| 阿坝县| 威宁| 肥西县| 钟山县| 榆中县| 伊吾县| 台东市| 江北区| 太湖县| 嘉黎县| 沁阳市| 定结县| 乌审旗| 阳江市| 孝感市| 香河县| 乐安县| 阜康市| 南涧| 铁岭市| 咸丰县| 肇庆市| 垫江县| 新宾| 资阳市| 沙坪坝区| 民勤县| 波密县| 永靖县| 陆河县| 且末县| 中江县| 武邑县| 抚顺县| 平凉市|