天天看點

JMETER JNI調用DLL取樣器開發

背景

上篇博文已實作了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頭檔案生成

JMETER JNI調用DLL取樣器開發

使用javah指令,在包路徑的最外面檔案夾,執行生成指令。com.jmeter.jna.fixapi為包名+類名生成路徑名_包名.h頭檔案。

這邊生成頭檔案也是頭疼了很久,因為執行路徑不對,一定要是包路徑的最外層檔案夾執行

3、編寫c,生成dll和so檔案

這塊他人做好使用

4、dll環境變量配置

windows系統

在“Path”中添加.dll所屬路徑

JMETER JNI調用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
           
JMETER JNI調用DLL取樣器開發

5、運作

取樣器具體開發過程參考上一文章,JNI調用dll過程如上。實踐下來,同一個接口進行測試,JNI實作比JNA實作吞吐量來講快了一倍不止。可以做性能測試使用了。