JNI-VISA應用攻略

安裝VC++ 6.0

安裝VISA。該軟件主頁爲www.ni.com

具體下載地址應爲:URL ftp://ftp.ni.com/support/visa/drivers/win32/3.2/visa320full.exe ,下載前可能要免費註冊。

其缺省安裝目錄C:/Program Files/VISA

 

建立c:/gpib目錄,創建JNI本地接口類:JGpib.java

##c:/gpib/JGpib.java

 

package org.eleaf.jni.gpib;

public class JGpib
{
    public native int open(String gpibAddr);
   
    public native int close();
   
    public native String read();
   
    public native int write(String cmdStr);
   
}

 

 

使用javac命令編譯JGpib.java.

c:/gpib>javac -d . ./JGpib.java

 

使用javah命令生成C++頭文件:

c:/gpib>javah -classpath . -d . org.eleaf.jni.gpib.JGpib

 

這是生成的頭文件:org_eleaf_jni_gpib_JGpib.h

 

##c:/gpib/org_eleaf_jni_gpib_JGpib.h

 

 

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

#ifndef _Included_org_eleaf_jni_gpib_JGpib

#define _Included_org_eleaf_jni_gpib_JGpib
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     org_eleaf_jni_gpib_JGpib
 * Method:    open
 * Signature: (Ljava/lang/String;)I
 */

JNIEXPORT jint JNICALL Java_org_eleaf_jni_gpib_JGpib_open
  (JNIEnv *, jobject, jstring);

/*
 * Class:     org_eleaf_jni_gpib_JGpib
 * Method:    close
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_org_eleaf_jni_gpib_JGpib_close
  (JNIEnv *, jobject);

/*
 * Class:     org_eleaf_jni_gpib_JGpib

 * Method:    read
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_org_eleaf_jni_gpib_JGpib_read
  (JNIEnv *, jobject);

/*
 * Class:     org_eleaf_jni_gpib_JGpib
 * Method:    write
 * Signature: (Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_org_eleaf_jni_gpib_JGpib_write
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

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

#ifndef _Included_org_eleaf_jni_gpib_JGpib

#define _Included_org_eleaf_jni_gpib_JGpib
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     org_eleaf_jni_gpib_JGpib
 * Method:    open
 * Signature: (Ljava/lang/String;)I
 */

JNIEXPORT jint JNICALL Java_org_eleaf_jni_gpib_JGpib_open
  (JNIEnv *, jobject, jstring);

/*
 * Class:     org_eleaf_jni_gpib_JGpib
 * Method:    close
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_org_eleaf_jni_gpib_JGpib_close
  (JNIEnv *, jobject);

/*
 * Class:     org_eleaf_jni_gpib_JGpib

 * Method:    read
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_org_eleaf_jni_gpib_JGpib_read
  (JNIEnv *, jobject);

/*
 * Class:     org_eleaf_jni_gpib_JGpib
 * Method:    write
 * Signature: (Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_org_eleaf_jni_gpib_JGpib_write
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

 

 

啓動VC++ 6.0:

 

1) 選擇[new]->[projects](選擇[Win32 Dynamic-Link Library],以測試程序中System.loadLibrary()方法中指定的dll庫名gpib作爲工程名)->[OK]->[An ampty DLL project]->[Finish]。
2) 選擇[Tools]->[Options]->[Directories](添加目錄%JAVA_HOME%/INCLUDE%JAVA_HOME%/INCLUDE/WIN32)。在這些目錄中包含JNI所需的頭文件。
3) 將上面生成的org_eleaf_jni_gpib_JGpib.h拷貝到gpib工程文件夾中。

該工程文件夾的缺省位置爲:

C:/Program Files/Microsoft Visual Studio/MyProjects/gpib

然後把它添加到VC++中工程目錄窗口中的[Head Files]條下。

 

然後是VC++中 VISA環境的設置,這在VISA的user guide文檔visa.pdf中有詳細說明。下面這段話是從該文檔摘錄過來的:

Microsoft Visual C++ Version 6.0 Compilers
1 Select Project > Settings from the menu and click the C/C++ tab.


2 Select Code Generation from the Category list box and select Multi-Threaded using DLL from the Use Run-Time Libraries list box. (VISA requires these definitions for Win32.) Click OK to close the dialog box.


3 Select Project > Settings from the menu. Click the Link tab and add visa32.lib to the Object/Library Modules list box. Optionally, you may add the library directly to your project file. Click OK to close the dialog box.

 

4 You may want to add the include files and library files search paths. They are set as follows:
•Select Tools > Options from the menu.
•Click the Directories tab to set the include file path.
•Select Include Files from the Show Directories For list box.
•Click at the bottom of the list box and type one of the following: C:/Program Files/VISA/win95/include or C:/Program Files/VISA/winnt/include.


5 Select Library Files from the Show Directories For list box.


6 Click at the bottom of the list box and type one of the following: C:/Program Files/VISA/win95/lib/msc or C:/Program Files/VISA/winnt/lib/msc

 

所有的環境設置都完成以後,就可以在VC++裏編寫cpp文件進行編譯連接了:

點擊工程目錄窗口中的[Source Files]創建一個新的cpp文件,命名爲org_eleaf_jni_gpib_JGpib.cpp:

 

##C:/Program Files/Microsoft Visual Studio/MyProjects/gpib/org_eleaf_jni_gpib_JGpib.cpp

 

#include <visa.h>
#include <stdio.h>
#include <string.h>
#include "org_eleaf_jni_gpib_JGpib.h"

//定義三個全局變量,供下面四個獨立函數調用。

static ViSession defaultRM;
static ViSession vi;
static char buf[256] = {0};

//以下四個獨立函數是按照上面的頭文件裏的函數定義創建的。

JNIEXPORT jint JNICALL Java_org_eleaf_jni_gpib_JGpib_open
  (JNIEnv *env, jobject obj, jstring jstr)
{

//將從java程序中傳進來的字符串轉化爲C++中的字符串格式。
 const char *str = env->GetStringUTFChars(jstr, 0);
 char cap[256];
 strcpy(cap, str);

/*

在VISA中,viOpen()、viClose()、viScanf()、viPrintf()等方法都會返回一個ViStatus類型的值,這個值對應C++中的int型,代表方法執行的結果。如果是正確,ViStatus返回爲VI_SUCCESS,值爲0。如果出錯,則返回各種負值,如:

 

 

-1073807299

VI_ERROR_INV_MASK

 

-1073807298

VI_ERROR_IO

 

-1073807297

VI_ERROR_INV_FMT

 

我們可以在C++程序中直接把這些ViStatus對象作爲int型的值進行調用,如:

printf("result=%d/n", VI_SUCCESS);將打印出:

result=0

printf("result=%d/n", VI_ERROR_IO);將打印出:

result=-1073807298

 

關於這部分,在VISA的API文檔裏面有詳細介紹,對於windows 2000,該文檔的地址爲:

C:/Program Files/VISA/winnt/agvisa/visa.chm

ViStatus的說明在該文檔[目錄]下的[VISA Library Information]下的[VISA Error Codes]條裏。

*/

ViStatus viss = viOpenDefaultRM (&defaultRM);
 ViStatus vis = viOpen(defaultRM, cap, VI_NULL, VI_NULL, &vi);
 return vis;
}


JNIEXPORT jint JNICALL Java_org_eleaf_jni_gpib_JGpib_close
  (JNIEnv *env, jobject obj)
{
 ViStatus viss = viClose(vi);
 ViStatus vis = viClose(defaultRM);
 return vis;
}

JNIEXPORT jstring JNICALL Java_org_eleaf_jni_gpib_JGpib_read
  (JNIEnv *env, jobject obj)
{
 viScanf(vi, "%t", &buf);

//將C++的字符串轉換爲java的字符串格式並返回。
 return env->NewStringUTF(buf);
}


JNIEXPORT jint JNICALL Java_org_eleaf_jni_gpib_JGpib_write
  (JNIEnv *env, jobject obj, jstring jstr)
{
 const char *str = env->GetStringUTFChars(jstr, 0);
 char cap[256];
 strcpy(cap, str);
 ViStatus vis = viPrintf(vi, cap);
 return vis;
}

 

 

點擊[Build]>[Compile org_eleaf_jni_gpib_JGpib.cpp]或按Ctrl + F7,編譯該cpp文件。

檢查一下下邊的[Build]窗口,看是否有錯誤出現,如果沒有錯誤,應該會出現如下的信息:

--------------------Configuration: gpib - Win32 Debug--------------------
Compiling...
Skipping... (no relevant changes detected)
org_eleaf_jni_gpib_JGpib.cpp

org_eleaf_jni_gpib_JGpib.obj - 0 error(s), 0 warning(s)

 

如果有錯誤,一般可能是語法問題環境設置不正確,請仔細更正,然後重新編譯。

然後點擊[Build]>[Build gpib.dll],生成動態鏈接庫文件。

編譯連接完成後,請將生成的gpib.dll文件拷貝到系統環境變量PATH中可以找到的任意位置,比如%JAVA_HOME%/bin;%TOMCAT_HOME%/bin等。

 

編寫測試程序:Test.java

##c:/gpib/Test.java

 

package org.eleaf.jni.gpib;

public class Test
{

    //裝載動態鏈接庫gpib.dll.
    static
    {
        System.loadLibrary("gpib");  
    }
    public static void main(String[] args)
    {
        JGpib jg = new JGpib();  

        /*

        VISA可以連接電腦的GPIB/USB/Serial/COM/等端口。這裏的ASRL1::INSTR字串表

        示連接的是COM1端口,關於該字串的格式,在VISA的API文檔裏面有詳細介紹,對

        於windows 2000,該文檔的地址爲:

        C:/Program Files/VISA/winnt/agvisa/visa.chm

        字串格式的說明在該文檔[目錄]下的[VISA Functions]下的[viOpen]條裏。

        */        
        int i = jg.open("ASRL1::INSTR");
        int j = jg.write("*RST/n");
        int a = jg.write("*IDN?/n");
        String s = jg.read();
        System.out.println("s=" + s);
        int b = jg.close();

        //關閉會話以後,嘗試調用write()方法發送指令,預計返回錯誤信息,即變量c、d的值將爲負數:
        int c = jg.write("*RST/n");
        int d = jg.write("*IDN?/n");
        System.out.println(i + ";" + j + ";" + a + ";" + b + ";" + c + ";" + d);
    }  
}

 

 

編譯執行Test.java

c:/gpib>javac -classpath . -d . Test.java

c:/gpib>java -classpath . org.eleaf.jni.gpib.Test

0;0;0;0;-1073807346;-1073807346

 

前面四個值爲0,代表ViStatus中的VI_SUCCESS,表示執行成功;

最後兩個負數值-1073807346,對應ViStatus中的VI_ERROR_INV_OBJECT(The object reference is invalid. ),表明在viClose()方法執行以後,會話已被關閉,繼續通過viPrintf()發送指令會發生錯誤。

發佈了75 篇原創文章 · 獲贊 3 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章