Java中的native方法實現(Java混用C/C++)
阿新 • • 發佈:2019-01-06
前言
- native關鍵字說明其修飾的方法是一個原生態方法,方法對應的實現不是在當前檔案,而是在用其他語言(如C和C++)實現的檔案中。Java語言本身不能對作業系統底層進行訪問和操作,但是可以通過JNI介面呼叫其他語言來實現對底層的訪問。
- JNI是Java本機介面(Java Native Interface),是一個本機程式設計介面,它是Java軟體開發工具箱(Java Software Development Kit,SDK)的一部分。JNI允許Java程式碼使用以其他語言編寫的程式碼和程式碼庫。Invocation API(JNI的一部分)可以用來將Java虛擬機器(JVM)嵌入到本機應用程式中,從而允許程式設計師從本機程式碼內部呼叫Java程式碼。不過,對Java外部的呼叫通常不能移植到其他平臺,在applet中還可能引發安全異常。實現原生代碼將使您的Java應用程式無法通過100%純Java測試。
實現步驟
1.書寫一個Java類
public class HelloWorld {
// 使用關鍵字native來宣告方法
public native void displayInfor(String name);
// 載入動態連結庫
static {
System.load("/Users/mac/Desktop/HelloWorldImpl.dylib");
}
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld();
helloWorld.displayInfor("馮強" );
}
}
其中public native void displayInfor(String name);,聲明瞭一個本地方法,有引數name,返回型別void。
System.load(“/Users/mac/Desktop/HelloWorldImpl.dylib”);表示載入一個本地動態連結庫。
2.使用下javac命令編譯該檔案:
Macs-MacBook-Pro:Desktop mac$ javac HelloWorld.java
我們會看到生成了一個HelloWorld.class檔案
3.使用javah命令處理HelloWorld.class檔案
Macs-MacBook -Pro:Desktop mac$ javah -jni HelloWorld
這時候我們可以看到生成了一個HelloWorld.h檔案:
4.開啟HelloWorld.h檔案
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayInfor
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayInfor
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
其中:
JNIEXPORT void JNICALL Java_HelloWorld_displayInfor
(JNIEnv *, jobject, jstring);
就是Java程式碼中對應的native方法,命名格式是 Java_類名_方法名(JNIEnv,jobject,這裡是引數)。
5.修改HelloWorld.h檔案中的#include
// 引入剛剛通過class檔案生成的.h檔案
#include "HelloWorld.h"
#include <stdio.h>
#include <iostream>
using namespace std;
/*
* Class: HelloWorld
* Method: displayInfor
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayInfor
(JNIEnv * env, jobject obj, jstring name) {
cout<<"你好,"<<env->GetStringUTFChars(name, NULL)<<endl;
}
8.使用g++處理HelloWorld.cpp生成動態連結庫
Macs-MacBook-Pro:Desktop mac$ g++ -dynamiclib -o HelloWorldImpl.dylib HelloWorld.cpp
9.複製HelloWorldImpl.dylib檔案的地址,放入到java檔案中
System.load("/Users/mac/Desktop/HelloWorldImpl.dylib");
10.最終的檔案如下:
11.執行Java程式
Macs-MacBook-Pro:Desktop mac$ java HelloWorld
你好,馮強
其它
- 原始碼下載
關注下方公眾號,回覆:jni.code