1. 程式人生 > >Java中的native方法實現(Java混用C/C++)

Java中的native方法實現(Java混用C/C++)

前言

  • 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檔案
微信公眾號:JavaWeb架構師

3.使用javah命令處理HelloWorld.class檔案

Macs-MacBook
-Pro:Desktop mac$ javah -jni HelloWorld

這時候我們可以看到生成了一個HelloWorld.h檔案:
圖片.png

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;
}

微信公眾號:JavaWeb架構師

8.使用g++處理HelloWorld.cpp生成動態連結庫

Macs-MacBook-Pro:Desktop mac$ g++ -dynamiclib -o HelloWorldImpl.dylib HelloWorld.cpp 

微信公眾號:JavaWeb架構師

9.複製HelloWorldImpl.dylib檔案的地址,放入到java檔案中

System.load("/Users/mac/Desktop/HelloWorldImpl.dylib");

10.最終的檔案如下:
微信公眾號:JavaWeb架構師

11.執行Java程式

Macs-MacBook-Pro:Desktop mac$ java HelloWorld
你好,馮強

微信公眾號:JavaWeb架構師

其它

  • 原始碼下載
關注下方公眾號,回覆:jni.code

完整教程PDF版本下載