2023年1月26日 星期四

java Native 調用 C

public class TestNative {
    public native void helloNative1();
    public static native void helloNative2();

    static {
        System.load(System.getProperty("user.dir") + "/xxx.dll");
    }

    public static void main(String[] args) {
        new TestNative().helloNative1();
        TestNative.helloNative2();
    }
}

※System.getProperty("user.dir") 為專案路徑
※xxx.dll 為 c 的程式碼變成的


產生 dll 的方法:
1.到 TestNative.java 打上 javac TestNative.java -h .
會產生副檔名為 h 和 class 的檔案

2.將副檔名為 h 的檔案複製一份出來改檔名為 cpp,完成後為如下的圖:


3.修改 cpp 檔案的內容,這個就是要實作 native 的內容

#include <jni.h>
#include <stdio.h>
#include "TestNative.h"

JNIEXPORT void JNICALL Java_TestNative_helloNative1
  (JNIEnv *, jobject) {
  printf("%s", "helloNative1\n");
  }

JNIEXPORT void JNICALL Java_TestNative_helloNative2
  (JNIEnv *, jclass) {
  printf("%s", "helloNative2\n");
  }

※要 include TestNative.h

4.到 sourceforge.net 下載 c 的編譯器 MinGW-w64,然後如下下載,並解壓



5.進入解壓後的資料夾的 bin
打上 gcc --version,出現版本號表示可以用 gcc 這個指令了
再打上 gcc -I "C:\Program Files\Java\jdk1.8.0_202\include" -I "C:\Program Files\Java\jdk1.8.0_202\include\win32" --shared -o xxx.dll D:\JavaProject\src\TestNative.cpp
會產生 xxx.dll 的檔案

※-I 表示 include,要包含兩個檔案,因為 3 的檔案要用到 jni.h,這個檔案在 include 裡;然後 jni.h 這個檔案還要 include jni_md.h,這個檔案在 include\win32

※-o 為 output,後面接想輸出的檔案名稱

※最後是 cpp 所在路徑

6.將得到的 xxx.dll 放在專案路徑下即可,其他 cpp、h 都可以不需要,結果畫面如下:










沒有留言:

張貼留言