安装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()发送指令会发生错误。
分享到:
相关推荐
JRTE - Java 实时编辑 [Android 和 CFW PS3 系统的 Java 实时修改] 这是针对 Java 实时模组的开发。 将 PS3 上的实时修改应用到便携式设备,例如 ... 需要做什么:Java 到 C++ 数据类型和 Visa-Versa 的 JNI 转换
通过LabVIEW的G语言和VISA(虚拟仪器软件架构),开发者可以轻松控制海康相机,进行图像采集和分析。 在进行海康工业相机开发时,开发者需要深入理解SDK文档,熟悉各种编程语言的API调用方法,同时,对于图像处理和...
轴类零件加工工艺设计.zip
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
seaborn基本绘图人力资源数据集
移动机器人(sw三维)
自制html网页源代码查看器
3吨叉车的液压系统设计().zip
1_实验三 扰码、卷积编码及交织.ppt
北京交通大学软件学院自命题科目考试大纲.pdf
雅鲁藏布江流域 shp矢量数据 (范围+DEM).zip
基于RUST的数据结构代码示例,栈、队列、图等
NIFD:2024Q1房地产金融报告
详细介绍及样例数据:https://blog.csdn.net/li514006030/article/details/146916652
【工业机器视觉定位软件Vision-Detect】基于C#的WPF与Halcon开发的工业机器视觉定位软件(整套源码),开箱即用 有用户登录,图片加载,模板创建,通讯工具,抓边抓圆,良率统计,LOG日志,异常管理,九点标定和流程加载保存等模块,功能不是很完善,适合初学者参考学习。 资源介绍请查阅:https://blog.csdn.net/m0_37302966/article/details/146912206 更多视觉框架资源:https://blog.csdn.net/m0_37302966/article/details/146583453
内容概要:本文档详细介绍了Java虚拟机(JVM)的相关知识点,涵盖Java内存模型、垃圾回收机制及算法、垃圾收集器、内存分配策略、虚拟机类加载机制和JVM调优等内容。首先阐述了Java代码的编译和运行过程,以及JVM的基本组成部分及其运行流程。接着深入探讨了JVM的各个运行时数据区,如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区等的作用和特点。随后,文档详细解析了垃圾回收机制,包括GC的概念、工作原理、优点和缺点,并介绍了几种常见的垃圾回收算法。此外,文档还讲解了JVM的分代收集策略,新生代和老年代的区别,以及不同垃圾收集器的工作方式。最后,文档介绍了类加载机制、JVM调优的方法和工具,以及常用的JVM调优参数。 适合人群:具备一定Java编程基础的研发人员,尤其是希望深入了解JVM内部机制、优化程序性能的技术人员。 使用场景及目标:①帮助开发人员理解Java代码的编译和执行过程;②掌握JVM内存管理机制,包括内存分配、垃圾回收等;③熟悉类加载机制,了解类加载器的工作原理;④学会使用JVM调优工具,掌握常用调优参数,提升应用程序性能。 其他说明:本文档内容详尽,适合用作面试准备材料和技术学习资料,有助于提高开发人员对JVM的理解和应用能力。
Android项目原生java语言课程设计,包含LW+ppt
戴德梁行&中国房地产协会:2021亚洲房地产投资信托基金研究报告
Android项目原生java语言课程设计,包含LW+ppt
Thinkphp6.0+vue个人虚拟物品发卡网站源码 支持码支付对接 扫码自动发货 源码一共包含两个部分thinkphp6.0后端文件,以及vue前端文件.zip