1. 程式人生 > >JNI調用實例

JNI調用實例

nat 安裝目錄 修改 oid gen 命令 microsoft bing c++

1. 環境

Windows7-64Bit

VS2010-32Bit

JDK1.8-64Bit

2. 步驟

2.1 創建NativePrint類

public class NativePrint {
    public native void nativePrint();
}

其中包含一個native方法,這個native方法是通過C++實現的,C++的實現代碼最終是生成dll文件,然後通過Java調用。

2.2 編譯NativePrint類以及生成頭文件

使用命令javac NativePrint.java編譯,然後在通過javah NativePrint命令生成頭文件,具體如下:

命令:

技術分享圖片

生成的文件:

技術分享圖片

其中NativePrint.h的文件內容為:文件內容不可以修改

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class NativePrint */

#ifndef _Included_NativePrint
#define _Included_NativePrint
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     NativePrint
 * Method:    nativePrint
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_NativePrint_nativePrint
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif  

2.3 C++實現NativePrint.nativePrint()方法

(1)安裝VS2010版本,然後創建一個32位dll的空項目,具體步驟:文件 -> 新建項目 - > Win32 - > Win32控制臺命令程序,然後下一步,做如下設置:

技術分享圖片技術分享圖片

(2)拷貝

D:\Program Files\Java\jdk1.8.0_111\include\win32\jawt_md.h

D:\Program Files\Java\jdk1.8.0_111\include\win32\jni_md.h

D:\Program Files\Java\jdk1.8.0_111\include\jni.h

NativePrint.h

四個文件拷貝到D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include,備註:具體目錄請參考自己本地的jdk和VS2010的安裝目錄;

(3)在native_print工程的源文件目錄下,創建NativePrint.cpp文件,內容如下:

技術分享圖片

#include <jni.h>  
#include <stdlib.h>  
#include <NativePrint.h>  
#ifdef __cplusplus  
extern "C" {  
#endif  
/*這個方法名稱一定要和頭文件的一模一樣,不過頭文件中的參數只有類型,沒有名稱,需要加成如下參數*/  
JNIEXPORT void JNICALL Java_NativePrint_nativePrint(JNIEnv *jenv, jobject jobj) {  
  /*就打印這一條語句*/  
  printf("=====888");  
}  
#ifdef __cplusplus  
}  
#endif 

2.4 編譯64位的dll文件

2.4.1 配置64的編譯環境

因為整個環境都是在64位進行,而VS2010的默認創建的工程都是32位的,需要修改。備註:如果不使用64位的dll則會報錯 java.lang.UnsatisfiedLinkError: D:\Program Files\Java\jdk1.8.0_111\bin\native_print.dll: Can‘t load IA 32-bit .dll on a AMD 64-bit platform

(1)點擊工具欄上面的配置管理器,如圖

技術分享圖片

(2)找到“活動解決方案平臺(P)”點擊新建

技術分享圖片

(3)選擇x64,然後保存即可。

技術分享圖片

2.4.2 編譯

然後按F7,就可以在工程目錄下面生成一個與工程同名的dll文件,如下:註意是在x64目錄下面

備註:如果在運行過程中遇到如下錯誤:LINK : fatal error LNK1123: 轉換到 COFF 期間失敗: 文件無效或損壞, 請參考http://blog.csdn.net/kevin_mqj/article/details/22981873 

技術分享圖片

2.5 運行

將生成的dll文件拷貝到java.library.path目錄下面,比如D:\Program Files\Java\jdk1.8.0_111\bin

創建一個測試java測試類,如Test.java

public class Test {
    static {
        System.loadLibrary("native_print");
    }

    public static void main(String[] args) {
        new NativePrint().nativePrint();
    }

}  

然後運行Test.java

結果截圖:

技術分享圖片

參考資料

http://blog.csdn.net/oscar999/article/details/7895367

http://blog.csdn.net/seanwang_25/article/details/17285505

http://blog.csdn.net/l527719041/article/details/77434652

http://blog.csdn.net/fenglibing/article/details/4300381

http://blog.csdn.net/kevin_mqj/article/details/22981873

https://stackoverflow.com/questions/8113080/cant-load-ia-32-bit-dll-on-a-amd-64-bit-platform

JNI調用實例