背景
上篇博文已實作了JNA調用DLL取樣器開發,進行功能性接口測試已滿足,但是在進行性能測試這塊就差強人意了。JNA使用起來确實是友善,但是在調用c++接口性能損耗這塊還是蠻大的,測試下來JNA開發跑下來吞吐量三千多,之前做的純C++測試工具跑下來吞吐量能達到七八千。
實作步驟
經查找資料,JNI實作調用c需要幾個步驟
1、建立一個Java類,該類中定義自己需要的 C 端的native方法;
2、根據該類編譯生成的.class檔案生成 C 所需要的頭檔案,也就是常說的.h檔案。
3、根據生成的 .h 檔案編寫C的功能實作,最後生成對應的dll(windows),so(linux)檔案,此處需要注意:生成的dll 的位數需要和Java環境的位數相同,否則會報錯。
4、拷貝生成的dll檔案到系統環境配置的某一檔案夾下
5、運作。
1、java類實作
public class fixapi50 {
{
/**
* 系統加載其他的語言的函數
*/
String apiPath=Platform.isWindows()?"jniFixApi":"jnifixapi";
System.loadLibrary(apiPath);
}
//申明動态庫檔案中的方法
/**
* 5.1 接口庫初始化
* @return 傳回true表示初始化成功;False表示失敗
*/
public native boolean Initialize();
/**
* 5.2 接口庫解除安裝
* @return 傳回true表示初始化成功;False表示失敗
*/
public native boolean Uninitialize();
//剩餘方法省略。。。。。。
}
System.loadLibrary 參數為庫檔案名,不包含庫檔案的擴充名。
注意linux環境,使用的是“jnifixapi”,實際對應的“libjnifixapi.so”檔案,名字相差了前面的lib
System.load 參數為庫檔案的絕對路徑,可以是任意路徑。
例如你可以這樣載入一個windows平台下JNI庫檔案:
System.load(“C://Documents and Settings//TestJNI.dll”);。
剛開始使用的load加載絕對路徑,開發起來友善,但是打包後給他人使用增加了使用負擔和難度,最後還是換成了loadLibrary,增加了第四步驟library配置的步驟
2、.h頭檔案生成

使用javah指令,在包路徑的最外面檔案夾,執行生成指令。com.jmeter.jna.fixapi為包名+類名生成路徑名_包名.h頭檔案。
這邊生成頭檔案也是頭疼了很久,因為執行路徑不對,一定要是包路徑的最外層檔案夾執行
3、編寫c,生成dll和so檔案
這塊他人做好使用
4、dll環境變量配置
windows系統
在“Path”中添加.dll所屬路徑
linux系統
設定系統變量LD_LIBRARY_PATH來添加java.library.path(該設定隻會對目前打開的shell視窗有效,是以每次打開新的shell運作程式不停地設定LD_LIBRARY_PATH)
export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/home/jinbing
或者永久設定
vim ~/.bash_profile
打開~/目錄下打開.bash_profile檔案,設定環境變量如下:
LD_LIBRARY_PATH=dir:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
5、運作
取樣器具體開發過程參考上一文章,JNI調用dll過程如上。實踐下來,同一個接口進行測試,JNI實作比JNA實作吞吐量來講快了一倍不止。可以做性能測試使用了。