JAVA JNI開發應用例項
阿新 • • 發佈:2019-01-26
一、基礎理論
百科介紹:JNI是Java Native Interface的縮寫,它提供了若干的API實現了Java和其他語言的通訊(主要是C&C++)。從Java1.1開始,JNI標準成為java平臺的一部分,它允許Java程式碼和其他語言寫的程式碼進行互動。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計的,但是它並不妨礙你使用其他程式語言,只要呼叫約定受支援就可以了。使用java與本地已編譯的程式碼互動,通常會喪失平臺可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的。例如,使用一些舊的庫,與硬體、作業系統進行互動,或者為了提高程式的效能。JNI標準至少要保證原生代碼能工作在任何Java 虛擬機器環境。
JNI的應用限制
一旦使用JNI,JAVA程式就喪失了JAVA平臺的兩個優點:
1、程式不再跨平臺。要想跨平臺,必須在不同的系統環境下重新編譯本地語言部分。
2、程式不再是絕對安全的,原生代碼的不當使用可能導致整個程式崩潰。一個通用規則是,你應該讓本地方法集中在少數幾個類當中。這樣就降低了JAVA和C之間的耦合性。
應用場合
當你開始著手準備一個使用JNI的專案時,請確認是否還有替代方案。應用程式使用JNI會帶來一些副作用。下面給出幾個方案,可以避免使用JNI的時候,達到與原生代碼進行互動的效果: 1、JAVA程式和本地程式使用TCP/IP或者IPC進行互動。 2、當用JAVA程式連線本地資料庫時,使用實現步驟
1 2 3 4 5 6 7 8 9 |
public class HelloWorld {
public native void displayHelloWorld(); //所有native關鍵詞修飾的都是對本地的宣告
static {
System.loadLibrary( "hello" ); //載入本地庫
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/*DO NOT EDI TTHIS FILE - it is mach inegenerated*/
#include<jni.h>
/*Header for class HelloWorld*/
#ifndef_Included_HelloWorld
#define_Included_HelloWorld
#ifdef__cplusplus
extern "C" {
#endif
/*
*Class:HelloWorld
*Method:displayHelloWorld
*Signature:()V
*/
JNIEXPORTvoidJNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv*,jobject);
#ifdef__cplusplus
}
#endif
#endif
|
1 2 3 4 5 6 7 8 9 10 11 |
#include"jni.h"
#include"HelloWorld.h"
//#includeotherheaders
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv*env,jobject obj)
{
printf ( "Helloworld!\n" );
return ;
}
|