JNI入門教程之HelloWorld篇一文中介紹了如何一步步編寫JNI相關的應用程序,并沒有更多的介紹相關的機制,本文主要介紹如何使用JNI把java程序和native程序結合起來。
當我們開始接觸JNI但是還不熟悉的時候,也許會這樣幾個問題:
讀完本文你將會明白如上問題的來龍去脈。首先我在重復一下如何編寫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,它是由如下四部分組成
看看方法的參數,由三個參數組成分別是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
新聞熱點
疑難解答