此文比較簡單,主要記錄主要步驟而已。
起因:公司需要將原先客戶端的JNI
邏輯搬到java
上,給測試同事搞自動化測試環境。原來在Android
上直接使用.so
文件,現在需要生成.dll
文件,由於沒搞過C/C++
,所以,又進坑了!
一、配置環境
第一步,下載Eclipse,安裝;下載JDK,安裝(不是重點,略過)
第二步,安裝cdt插件(在Eclipse開發C/C++,生成dll文件使用)
打開 Eclipse Marketplace
搜索CDT安裝,此處圖示,我已經安裝,在你們電腦上應該是install,點擊安裝下一步就可以(我公司網非常差,所以安裝了3次才成功!!!!)
MinGW下載安裝,配置環境
- 下載,解壓使用
下載官網:http://www.mingw.org/,由於是外國的網站可能下載的時候有些慢,這裏提供網盤分享:http://pan.baidu.com/s/1cIIG7k (該版本適用於windows 32/64系統)
配置環境變量(win10是鍵值對形式,比較直觀)
打開環境變量中的path,在最後面加上
;D:\mingw\bin;
(目錄參考)即可
- 下載,解壓使用
二、JNI代碼編寫
第一步,創建一個 java類,包含native接口
package com.rytong.test; public class JNILib { // static { // System.loadLibrary("libMyJniLib"); // } public static native void jniPrint(String str); }
使用javah命令
有兩個注意要點:1. java7及以上版本,執行javah目錄是src目錄;2. java7以下版本,執行javah目錄爲bin目錄(有class文件的目錄);3. javah 後面的命令格式爲:
D:\eclipse\work\HelloWorld\src>javah com.rytong.test.JNILib
,類名去掉.java後綴,前面補全包名即可。- 執行javah命令生成對應的.h文件
- 執行命令不報錯則刷新工程,即可在src目錄下找到.h文件
創建C++項目
創建一個C++項目,選擇shared libary形式創建
將之前生成的.h投文件copy到src的子包下,補全形參
JNIEXPORT void JNICALL Java_com_rytong_test_JNILib_jniPrint
(JNIEnv *env, jclass jthis, jstring str);編寫cpp文件(JNI中的語法,不是重點,忽略)
#include "com_rytong_test_JNILib.h" JNIEXPORT void JNICALL Java_com_rytong_test_JNILib_jniPrint (JNIEnv *env, jclass jthis, jstring str){ jboolean iscopy =false; const char *charData = env->GetStringUTFChars(str, &iscopy); printf("The data from java is:%s",charData); env->ReleaseStringUTFChars(str, charData); }
三、DLL文件生成
項目右鍵,選擇properties,找到如下選項,在linker flags處填入:-Wl,–add-stdcall-alias
編譯dll文件:選中項目–> build–>release,會生成一個release文件夾,即可得到編譯好的dll文件。
四、DLL文件使用
在調用的過程中有點小插曲,之前的一個項目代碼不知道怎麼回事,不報錯就是執行不成功,沒有深究,新換個工程就ok了。
把dll文件放到lib文件夾中(文件存放位置隨意,後面步驟能找到即可),在原先的包含native接口的類中加載lib(在其他類中加載也可以)
public class JNILib { static { System.loadLibrary("libMyJniLib"); } public static native void jniPrint(String str); }
加載lib在運行時會找不到dll文件,則需要進行如下配置
調用jni的方法,執行,直接上運行結果圖