IDE版本:IntelliJ Idea 2019、Visual Studio 2019
JDK版本:JDK 1.8
1)使用idea創建一個簡單的java項目NativeTest。如下:
Main類的代碼如下:
package com.native_test;
public class Main {
private static native int multiply(int a, int b);
static {
}
public static void main(String[] args) {
System.out.println(multiply(2,3));
}
2)選中Main類文件,右鍵,Open in Terminal,進到終端,輸入如下命令:
javac Main.java -d ./
成功後,在當前目錄下會多出一個com目錄,最內層是編譯成功的Main.class文件。
3)繼續執行下面的語句:
javah -classpath ./ -jni com.native_test.Main
在當前目錄下會生成一個頭文件com_native_test_Main.h:
4)打開vs2019,創建一個c++空項目:
5)將剛纔生成的頭文件,複製到項目當前目錄下:
6)回到vs中,點擊顯示所有文件,下面標紅的按鈕:
右鍵選中該文件,點擊包括在項目中。取消顯示所有文件,頭文件就自動包含在了頭文件文件夾裏了。如果不是自動包含在頭文件裏面,也可以右鍵選中頭文件夾,選擇添加,選擇現有項手動添加進來。
7)包含進來後,你會發現,裏面是有錯誤的,這是因爲缺少jni.h頭文件。選擇項目,右鍵=》屬性。然後選擇VC++ 目錄,選擇包含目錄。
點擊向下按鈕,點擊編輯,把jdk的兩個目錄win32和include包含進來:
點擊確定,包含進來後,報錯就消失了。
8)右鍵選擇源文件,添加=》新建項,選擇C++文件,命名爲NativeMethod,點擊添加:
9)在NativeMethod.cpp裏面添加如下代碼:
#include<iostream>
#include "com_native_test_Main.h"
using namespace std;
JNIEXPORT jint JNICALL Java_com_native_1test_Main_multiply
(JNIEnv* env, jclass jcl, jint a, jint b)
{
return a * b;
}
10)右鍵選擇項目,選擇屬性,把配置類型修改爲動態庫,然後右鍵選擇項目,生成,就在當前項目目錄的debug目錄下自動生成了dll文件。注意,不是Java_Native_Method目錄下的debug目錄,而是和Java_Native_Method.sln文件平級的debug目錄:
11)將最開始的java代碼改爲下面的代碼:
package com.native_test;
public class Main {
private static native int multiply(int a, int b);
static {
//採用靜態路徑加載
System.load("E:\\Project\\C++\\Java_Native_Method\\Debug\\Java_Native_Method.dll");
//該種方式要求把dll所在的目錄加到系統環境變量中,或者把dll文件拷貝到該java項目的當前目錄下
// System.loadLibrary("Java_Native_Method");
}
public static void main(String[] args) {
System.out.println(multiply(2,3));
}
}
12)點擊運行,輸出內容如下:
運行成功。
如果你的系統是64位的,那麼會報下面的錯誤:
Can't load IA 32-bit .dll on a AMD 64-bit platform
這個時候需要把c++的dll編譯成64位的,方法是右鍵選擇項目,選擇屬性,點擊配置管理器,把下面標註的地方都改成64位:
這一步操作後需要重新做一下第七步的設置和第十步的配置類型設置。然後再重新生成,在debug的同級目錄下會多出一個64的目錄:
把Java代碼裏面的目錄,改成這個目錄,再點擊運行,問題就解決了:
System.load("E:\\Project\\C++\\Java_Native_Method\\x64\\Debug\\Java_Native_Method.dll");