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

首頁 > 學院 > 開發設計 > 正文

使用JNI集成java與native程序

2019-11-18 14:53:42
字體:
來源:轉載
供稿:網友

    JNI入門教程之HelloWorld篇一文中介紹了如何一步步編寫JNI相關的應用程序,并沒有更多的介紹相關的機制,本文主要介紹如何使用JNI把java程序和native程序結合起來。

    當我們開始接觸JNI但是還不熟悉的時候,也許會這樣幾個問題:

  1. Java程序和native程序的數據類型通常是不一樣的,它們怎么相互映射的呢?
  2. 怎么在native方法中訪問java方法傳遞過來的數據呢?
  3. 在native方法中可以創建java對象嗎?
  4. 如何把結果返回給調用它的java方法?

    讀完本文你將會明白如上問題的來龍去脈。首先我在重復一下如何編寫JNI相關的應用程序,我們必須在java方法中聲明一個native的方法,比如public native String getLine(String PRompt);這個方法具有的兩個特點是,引入了要害字native,它的意思是這個方法的實現由其他的語言實現,比如c/c++等。另外這個方法是以分號結尾的,表明這個方法不包括實現。我們在上篇文章已經知道使用javah命令可以得到我們需要的header文件。下面給出java程序和相關的.h文件的代碼

//Prompt.java
class Prompt {
  private native String getLine(String prompt);
  public static void main(String args[]) {
    Prompt p = new Prompt();
    String input = p.getLine("Type a line: ");
    System.out.println("User typed: " + input);
  }
  static {
    System.loadLibrary("prompt");
  }
}

//Prompt.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Prompt */

#ifndef _Included_Prompt
#define _Included_Prompt
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Prompt
 * Method:    getLine
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_Prompt_getLine
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

    我們可以看到在Prompt.h文件中定義了我們要實現的函數的原型,我們主要關心兩點一個是方法名稱另一個是方法的參數,方法的名稱為Java_Prompt_getLine,它是由如下四部分組成
使用JNI集成java與native程序(圖一)

 

 

 

 

看看方法的參數,由三個參數組成分別是JNIEnv *, jobject, jstring。JNIEnv是一個JNI接口指針,它事實上是由函數表組成的,我們可以使用JNIEnv來訪問java對象。jobject是當前類的的引用,想當與java中的this。最后一個參數是jstring,代表了我們java方法中的String prompt。

    在編寫native方法的時候,無論是java基本類型還是對象我們都不能在c/c++中直接使用,必須要轉成相對應得類型,下面給出基本數據類型的對應關系。

Java TypeNative TypeSize in bitsbooleanjboolean8, unsignedbytejbyte8charjchar16, unsignedshortjshort16intjint32longjlong64floatjfloat32doublejdouble64voidvoidn/a



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 塔城市| 松滋市| 三门峡市| 洛隆县| 西充县| 宜君县| 日土县| 渑池县| 庆云县| 昂仁县| 吉木萨尔县| 桦川县| 蒙城县| 铅山县| 南岸区| 沅江市| 虞城县| 上蔡县| 南涧| 玉林市| 罗田县| 北票市| 潼南县| 肇源县| 子洲县| 普兰店市| 讷河市| 岳阳县| 南江县| 阜城县| 宜宾县| 峡江县| 黄龙县| 定安县| 宁津县| 邳州市| 呈贡县| 乌拉特前旗| 通辽市| 板桥市| 武邑县|