(1)jna是对jni的封装,让java使用者能更好的使用本地的动态库

(2)使用jna需要下载jna的jar包,该jar包就是对jni的封装,所以在调用效率上来讲,jna是要比jni低一点的,不过对于大多数项目来说,没有很直观的体现。

(3)将jar包添加到项目中后,写一个接口类,用来和动态库建立联系,并声明动态库中的方法,具体的代码如下:

package com.wxyz.lib_to_java;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.FloatByReference; public interface DllInterface extends Library {
public static String dllName = "EduDeltaDLL(64)";// 动态库名字 DllInterface INSTANCE = (DllInterface) Native.loadLibrary(dllName, DllInterface.class);// 动态库实例 public String SearchBrobot();// 搜索可用的串口,以字符串的形式返回 public int ConnectBrobot(String comName, int baudrate);// 通过制定的串口和波特率跟机械臂连接 public void DisConnectBrobot();// 断开和机械臂的连接 public void SetCmdTimeOut(int cmdTimeOut);// 设置读写超时的时间 public void SetCmdRepeat(int repeatNum);// 设置读写超时或者错误时,重发次数 public int SetJointAccelerationAndSpeed(float[] acc, float[] vec);// 设置关节加速度和速度 public int GetJointAccelerationAndSpeed(float[] acc, float[] vec);// 获取关节加速度和速度 public int SetJointGoalAngleValue(byte MoveMethod, float value, float[] goalangle);// 设置关节的目标角度 public int GetJointCurrentAngleValue(float[] currentangle);// 获取关节的目标角度 public int GetJointCurrentStatus(byte[] currentstatus);// 获取关节的当前运动状态 public int SetTerminalVectorSpeed(float[] Speedxyz);// 设置执行端的速度向量 public int GetTerminalVectorSpeed(float[] Speedxyz);// 获取执行端的速度向量 public int SetTerminalAverageSpeed(float averagespeed);// 设置执行端的速度标量 public int GetTerminalCurrentCoordinate(float[] currentcoor);// 获取执行端当前的坐标 public int SetTerminalGoalCoordinate(byte MoveMethod, float value, float[] goalcoor);// 设置执行端的目标坐标 public int GetArmCurrentStatus(ByteByReference movementstatus);// 获取机械臂的运动状态(三个关节都静止状态才是静止,否则状态为运动) public int SetJointAngleAndCoordinateIncrement(float[] increment);//设置机械臂的关节角度和执行端坐标的增量步长。 public int GetJointAngleAndCoordinateIncrement(float[] increment);//获取机械臂的关节角度和执行端坐标的增量步长。 public int SetJointAngleOrCoordinateStep(byte movestep);//设置关节角度或者执行端坐标变化的步数(增加/减小一次,调用一次) public int SetArmPenHeight(float penheight);//机械臂台笔的高度 public int GetArmPenHeight(FloatByReference penheight);//获取机械臂的抬笔高度 public int SetPaintPictureNumber(float scaling, float[] offset, short picnum);//设置写字画画时,图片的缩放比,x,y 轴偏移量和图片编号 public int SetArmPaintMovementSignal(byte movsignal);//设置写字绘画时机械臂动作信号 public int GetArmPaintMovementSignal(ByteByReference movsignal);//获取写字绘画时机械臂动作信号 public int SetLaserLevelValue(byte[] levelvalue);//设置激光的等级值 public int GetLaserLevelValue(byte[] levelvalue);//获取激光的等级值 public int SetEngravePictureNumber(float scaling, float[] offset, short picnum);//设置激光雕刻时,图片的缩放比,x,y 轴偏移量和图片编号 public int SetArmEngraveMovementSignal(byte movsignal);//设置激光雕刻时机械臂动作信号 public int GetArmEngraveMovementSignal(ByteByReference movsignal);//获取激光雕刻时机械臂动作信号 public int SendEngravePathData(byte laserlevel, byte pathtype,float[] goalcoor);//向嵌入式端发送激光雕刻的图片的路径数据 public int SetGoalCoordinateTrajectoryLine(byte movMethod, float value,float[] goalcoor);//设置目标坐标(以直线运动到目标点) public int SetGoalCoordinateTrajectoryDoor(float doorheight, float speedrate, float[] goalcoor);//设置目标坐标(以门型轨迹运动到目标点) public int SetTrajectoryMovementSpeed(float speed);//设置轨迹运动的速度 public int SendTrajectoryData(byte ex,byte flag,float[] goalcoor);//发送轨迹数据 public int SetCommandQueueExecuteMethod(byte type);//设置指令队列的运行方式 public int SetCommandQueueDownloadMethod(byte type);//设置指令队列的下载方式 public int ClearCommandQueue(byte type);//通知控制器清空指令队列 public int GetCommandQueueInformation(byte type,ByteByReference information);//获取指令队列的信息
}

(4)这里需要注意的是,参数在动态库跟java方法之间传递的时候,需要遵循数据格式的转换,实质上java所用的参数类型所使用的内存空间一定要满足动态库中的参数需要的控件,无论是指针还是结构体还是引用,jna包中封装了很多数据格式转换的类,比如java中没有的指针,引用,结构体,在 这个包中都有相关的类来实现。

(5)使用java类来实现接口中的方法,给程序用代码如下:

package com.wxyz.lib_to_java;

import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.FloatByReference; /**
* Java控制机械臂控制器接口类
*
* @author dengchaoqun
* @version 1.0
*
*/
public class ArmControlInterface {
public static final int BRobotConnect_NoError = 0;// 串口正常连接
public static final int BRobotConnect_NotFound = 1;// 没有找到控制器
public static final int BRobotConnect_Occupied = 2;// 表示控制器被占用
public static final int BRobotConnect_Error = 3;// 连接错误
public static final int PACKETTXRXSUCCEED = 4;// 函数正常执行
public static final int TXTIMEOUT = 5;
public static final int TXFAIL = 6;
public static final int RXTIMEOUT = 7;
public static final int RXFAIL = 8;
public static final int ILLEGALPACEKTLENGTH = 9;
public static final int CHECKSUMERROR = 10;
public static final int UNKNOWNERROR = 11;
public static final int WARNINGTAG = 12;
public static final int FEEDBACKPACKETERROR = 13; public static final byte COORDINATE_X_UP = 0x12;// 表示x增加一个步长
public static final byte COORDINATE_X_DOWN = 0x13;// 表示x减小一个步长
public static final byte COORDINATE_Y_UP = 0x14;// 表示y增加一个步长
public static final byte COORDINATE_Y_DOWN = 0x15;// 表示y减小一个步长
public static final byte COORDINATE_Z_UP = 0x16;// 表示z增加一个步长
public static final byte COORDINATE_Z_DOWN = 0x17;// 表示z减小一个步长
public static final byte JOINT_S1_UP = 0x22;// 表示关节s1角度增加一个步长
public static final byte JOINT_S1_DOWN = 0x23;// 表示关节s1角度减小一个步长
public static final byte JOINT_S2_UP = 0x24;// 表示关节s2角度增加一个步长
public static final byte JOINT_S2_DOWN = 0x25;// 表示关节s2角度减小一个步长
public static final byte JOINT_S3_UP = 0x26;// 表示关节s3角度增加一个步长
public static final byte JOINT_S4_DOWN = 0x27;// 表示关节s3角度减小一个步长 public static final byte STOP = 0x00;// 写字画画激光雕刻停止动作
public static final byte START = 0x01;// 写字画画激光雕刻开始执行动作
public static final byte PAUSE = 0x02;// 写字画画激光雕刻暂停动作 public static final byte TIME_MOVE_METHOD = 0x01;// 以时间的方式运动到目标位置
public static final byte SPEED_MOVE_METHOD = 0x02;// 以速度的运动方式来运动到终点 public static final byte POINT_TYPE_START = 0x6D;// 路径点的起点
public static final byte POINT_TYPE_COMMOM = 0x6c;// 除起点外的路径点 /**
* 获取本机的串口信息,串口名字
*
* @return String[]数组里的元素表示可用的串口
*/
public static String[] searchBRobotCom() {
String msg = DllInterface.INSTANCE.SearchBrobot();
String[] coms = msg.split(" ");
return coms;// 搜索可用的串口,以字符串
} /**
* 通过制定串口跟机械臂控制器连接
*
* @param name
* 串口名
* @param baudrate
* 波特率
* @return 连接状态 0表示连接控制器成功 1表示未找到控制器 2表示控制器接口被占用
*/
public static int connectBRobotCom(String name, int baudrate) {
int statusID = DllInterface.INSTANCE.ConnectBrobot(name, baudrate);
return statusID;
} /**
* 设置读写超时的时间
*
* @param cmdTimeOut
* 单位为毫秒,如果没有设置,默认为1ms
*/
public static void setCmdTimeOut(int cmdTimeOut) {
DllInterface.INSTANCE.SetCmdTimeOut(cmdTimeOut);
} /**
* 设置读写超时或者错误时,重发次数
*
* @param times
* 超时重发次数,如果没有设置,默认的为100次
*/
public static void setCmdRepeat(int times) {
DllInterface.INSTANCE.SetCmdRepeat(times);
} /**
* 断开和机械臂控制器的连接
*/
public static void disConnectBRobotCom() {
DllInterface.INSTANCE.DisConnectBrobot();
} /**
* 设置关节加速度和速度
*
* @param acc
* acc长度为3,分别对应关节1,2,3的加速度
* @param vec
* vec长度为3,分别对应关节1,2,3的速度
* @return 状态码 如果返回的是4 PACKETTXRXSUCCEED,表示正确的执行,其它状态参照本类顶部的状态码
*/
public static int setJointAccelerationAndSpeed(float[] acc, float[] vec) {
int status = DllInterface.INSTANCE.SetJointAccelerationAndSpeed(acc, vec);
return status;
} /**
* 获取关节的速度和加速度
*
* @return Object类型,如果是属于Integer类型,则代表出现了错误,如果是float[]数组类型,则表示结果返回正常,其中float
* []长度为6,分别对应关节1,2,3的加速度和关节1,2,3的速度。
*/
public static Object getJointAccelerationAndSpeed() {
float[] acc = new float[] { 0, 0, 0 };
float[] vec = new float[] { 0, 0, 0 };
int status = DllInterface.INSTANCE.GetJointAccelerationAndSpeed(acc, vec);
if (status != PACKETTXRXSUCCEED) {
return status;
} else {
float[] speed = new float[acc.length + vec.length];
System.arraycopy(acc, 0, speed, 0, acc.length);
System.arraycopy(vec, 0, speed, acc.length, vec.length);
return speed;
}
} /**
* 设置关节的目标角度
*
* @param MoveMethod
* 运动方式,为1时表示以时间的方式运动到目标位置,为2时表示以速度的方式运动到目标位置
* @param value
* 当MoveMethod=1时,value表示时间,当MoveMethod=2时,此时value的值无效
* @param goalangle
* 长度为3的float数组,数组的三个元素分别表示关节1,2,3的目标角度
* @return 状态码 如果返回的是4 PACKETTXRXSUCCEED,表示正确的执行,其它状态参照本类顶部的状态码
*/
public static int setJointGoalAngleValue(byte MoveMethod, float value, float[] goalangle) {
int status = DllInterface.INSTANCE.SetJointGoalAngleValue(MoveMethod, value, goalangle);
return status;
} /**
* 获取关节的目标角度
*
* @return Object类型,如果是属于Integer类型,则代表出现了错误,返回的是状态码,如果是float[]数组类型,则表示结果返回正常
* ,其中float数组的长度为3,分别对应关节1,2,3当前的角度值
*/
public static Object getJointCurrentAngleValue() {
float[] currentangle = new float[] { 0, 0, 0 };
int status = DllInterface.INSTANCE.GetJointCurrentAngleValue(currentangle);
if (status != PACKETTXRXSUCCEED) {
return status;
} else {
return currentangle;
}
} /**
* 获取关节的当前运动状态
*
* @return Object类型,当返回类型为int类型的时候,表示出现了错误,返回错误码;当返回类型为长度为3的byte[]的时候,
* 数组元素值分别对应关节1,2,3当前运动状态,1表示运功,0表示静止
*/
public static Object getJointCurrentStatus() {
byte[] currentstatus = new byte[] { (byte) 0, (byte) 0, (byte) 0 };
int status = DllInterface.INSTANCE.GetJointCurrentStatus(currentstatus);
if (status != PACKETTXRXSUCCEED) {
return status;
} else {
return currentstatus;
}
} /**
* 设置执行端的速度向量
*
* @param Speedxyz
* 长度为3的float数组,数组元素分别对应执行端x,y,z的速度
* @return 状态码 PACKETTXRXSUCCEED表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表。
*/
public static int setTerminalVectorSpeed(float[] Speedxyz) {
int status = DllInterface.INSTANCE.SetTerminalVectorSpeed(Speedxyz);
return status;
} /**
* 获取执行端的速度向量
*
* @return Object
* 当返回值类型为int使表示发生了错误,返回的是错误码;当返回值为长度为3的float[]类型时,数组元素分别表示执行端x,y,
* z的速度
*/
public static Object getTerminalVectorSpeed() {
float[] speedxyz = new float[] { 0, 0, 0 };
int status = DllInterface.INSTANCE.GetTerminalVectorSpeed(speedxyz);
if (status != PACKETTXRXSUCCEED) {
return status;
} else {
return speedxyz;
}
} /**
* 设置执行端的速度标量
*
* @param averagespeed
* 表示对应执行端的一个标量速度
* @return 状态码 PACKETTXRXSUCCEED表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表。
*/
public static int setTerminalAverageSpeed(float averagespeed) {
int status = DllInterface.INSTANCE.SetTerminalAverageSpeed(averagespeed);
return status;
} /**
* 获取执行端当前的坐标
*
* @return Object
* 当返回值类型为int使表示发生了错误,返回的是错误码;当返回值为长度为3的float[]类型时,数组元素分别表示执行端坐标x,y,
* z的值
*/
public static Object getTerminalCurrentCoordinate() {
float[] currentcoor = new float[] { 0, 0, 0 };
int status = DllInterface.INSTANCE.GetTerminalCurrentCoordinate(currentcoor);
if (status != PACKETTXRXSUCCEED) {
return status;
} else {
return currentcoor;
}
} /**
* 设置执行端的目标坐标
*
* @param MoveMethod
* 表示运动方式 ,1表示以时间的方式运动到目标位置,2表示以速度的方式运动到指定位置
* @param value
* 表示时间或者速度 ,当MoveMethod=1时,value表示时间;当MoveMethod=2时,value表示速度
* @param goalcoor
* 表示执行端x,y,z的坐标
* @return 状态码 PACKETTXRXSUCCEED表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表。
*/
public static int setTerminalGoalCoordinate(byte MoveMethod, float value, float[] goalcoor) {
int status = DllInterface.INSTANCE.SetTerminalGoalCoordinate(MoveMethod, value, goalcoor);
return status;
} /**
* 获取机械臂的运动状态(三个关节都静止状态才是静止,否则状态为运动)
*
* @return Object 当返回值类型为int使表示发生了错误,返回的是错误码;如果返回值是byte类型,当值为1表示运动,0表示静止
*/
public static Object getArmCurrentStatus() {
ByteByReference b = new ByteByReference();
int status = DllInterface.INSTANCE.GetArmCurrentStatus(b);
if (status != PACKETTXRXSUCCEED) {
return status;
} else {
return b.getValue();
}
} /**
* 设置机械臂的关节角度和执行端坐标的增量步长。
*
* @param increment
* 长度为2的float数组,increment[1]表示关节角度的增量步长,increment[2]表示执行端坐标的增量步长
* @return 状态码 PACKETTXRXSUCCEED表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表。
*/
public static int setJointAngleAndCoordinateIncrement(float[] increment) {
int status = DllInterface.INSTANCE.SetJointAngleAndCoordinateIncrement(increment);
return status;
} /**
* 获取机械臂的关节角度和执行端坐标的增量步长
*
* @return Object
* 当返回值类型为int使表示发生了错误,返回的是错误码;如果返回值是长度为2的float[]类型,数组元素分别表示关节角度的增量步长
* ,执行端坐标的增量步长。
*/
public static Object getJointAngleAndCoordinateIncrement() {
float[] increment = new float[] { 0, 0 };
int status = DllInterface.INSTANCE.GetJointAngleAndCoordinateIncrement(increment);
if (status != PACKETTXRXSUCCEED) {
return status;
} else {
return increment;
}
} /**
* 设置关节角度或者执行端坐标变化的步数(增加/减小一次,调用一次)
*
* @param movestep
* 可选值有:COORDINATE_X_UP 表示x增加一个步长,COORDINATE_X_DOWN
* 表示x减小一个步长,COORDINATE_Y_UP 表示y增加一个步长,COORDINATE_Y_DOWN
* 表示y减小一个步长,COORDINATE_Z_UP 表示z增加一个步长,COORDINATE_Z_DOWN
* 表示z减小一个步长,JOINT_S1_UP 表示关节s1角度增加一个步长,JOINT_S1_DOWN
* 表示关节s1角度减小一个步长,JOINT_S2_UP 表示关节s2角度增加一个步长,JOINT_S2_DOWN
* 表示关节s2角度减小一个步长,JOINT_S3_UP 表示关节s3角度增加一个步长,JOINT_S4_DOWN
* 表示关节s3角度减小一个步长
* @return 状态码 PACKETTXRXSUCCEED表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表
*/
public static int setJointAngleOrCoordinateStep(byte movestep) {
int status = DllInterface.INSTANCE.SetJointAngleOrCoordinateStep(movestep);
return status;
} /**
* 设置机械臂台笔的高度
*
* @param penheight
* float类型的高度值
* @return 状态码 PACKETTXRXSUCCEED表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表
*/
public static int setArmPenHeight(float penheight) {
int status = DllInterface.INSTANCE.SetArmPenHeight(penheight);
return status;
} /**
* 获得机械臂台笔的高度
*
* @return Object 当返回值类型为int使表示发生了错误,返回的是错误码;如果返回值是float类型,则表示返回的机械臂台笔的高度
*/
public static Object getArmPenHeight() {
FloatByReference penheight = new FloatByReference();// 指针参数,表示传入高度的地址
int status = DllInterface.INSTANCE.GetArmPenHeight(penheight);
if (status != PACKETTXRXSUCCEED) {
return status;
} else {
float h = penheight.getValue();
return h;
}
} /**
* 设置写字画画时,图片的缩放比,x,y 轴偏移量和图片编号
*
* @param scaling
* float类型表示图片相对于原图的缩放比
* @param offset
* 长度为2的float数组类型,表示图片相对于原图的缩放比例,offset[1]表示x轴的偏移量,offset[2]
* 表示y轴的偏移量
* @param picnum
* 表示图片的编号,高字节表示图片的类别,低字节表示图片编
* @return 状态码 PACKETTXRXSUCCEED表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表
*/
public static int setPaintPictureNumber(float scaling, float[] offset, short picnum) {
int status = DllInterface.INSTANCE.SetPaintPictureNumber(scaling, offset, picnum);
return status;
} /**
* 设置写字绘画时机械臂动作信号
*
* @param movsignal
* 机械臂动作信号,可选信号有:STOP表示停止动作,START表示开始动作,PAUSE表示暂停动作
* @return 状态码 PACKETTXRXSUCCEED表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表
*/
public static int setArmPaintMovementSignal(byte movsignal) {
int status = DllInterface.INSTANCE.SetArmPaintMovementSignal(movsignal);
return status;
} /**
* 获取写字绘画时机械臂动作信号
*
* @return Object 当返回值类型为int使表示发生了错误,返回的是错误码;如果返回值是byte类型则表示写字画画时的动作信号;0x00
* 表示停止动作,0x01 表 示开始执行动作,0x02 表示暂停动作
*/
public static Object getArmPaintMovementSignal() {
ByteByReference b = new ByteByReference();
int status = DllInterface.INSTANCE.GetArmPaintMovementSignal(b);
if (status != PACKETTXRXSUCCEED) {
return status;
} else {
return b.getValue();
}
} /**
* 设置激光的等级值
*
* @param levelvalue
* 长度为2的byte[],数组元素分别对应激光功率FirSca和SecSca的值
* @return 状态码 PACKETTXRXSUCCEED表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表
*/
public static int setLaserLevelValue(byte[] levelvalue) {
int status = DllInterface.INSTANCE.SetLaserLevelValue(levelvalue);
return status;
} /**
* 获取激光的等级值
*
* @return Object 当返回值类型为int使表示发生了错误,返回的是错误码;如果返回值是长度为2的byte[]类型,
* 数组元素分别表示激光功率FirSca和SecSca的值,ThirdSca 默认对应满功率值100
*/
public static Object getLaserLevelValue() {
byte[] levelvalue = new byte[] { 0, 0 };
int status = DllInterface.INSTANCE.GetLaserLevelValue(levelvalue);
if (status != PACKETTXRXSUCCEED) {
return status;
} else {
return levelvalue;
}
} /**
* 设置激光雕刻时,图片的缩放比,x,y 轴偏移量和图片编号
*
* @param scaling
* 表示图片相对于原图的缩放比例
* @param offset
* 表示图片相对于默认位置的偏移量;offset[0]表示x 轴的偏移量, offset[1]表示y 轴的偏移量
* @param picnum
* picnum 表示图片的编号,高字节表示图片的类别,低字节表示图片编 号
* @return PACKETTXRXSUCCEED 表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表
*/
public static int setEngravePictureNumber(float scaling, float[] offset, short picnum) {
int status = DllInterface.INSTANCE.SetEngravePictureNumber(scaling, offset, picnum);
return status;
} /**
* 设置激光雕刻时机械臂动作信号
*
* @param movsignal
* 机械臂动作信号,可选信号有:STOP表示停止动作,START表示开始动作,PAUSE表示暂停动作
* @return PACKETTXRXSUCCEED 表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表
*/
public static int setArmEngraveMovementSignal(byte movsignal) {
int status = DllInterface.INSTANCE.SetArmEngraveMovementSignal(movsignal);
return status;
} /**
* 获取激光雕刻时机械臂动作信号
*
* @return Object 当返回值类型为int使表示发生了错误,返回的是错误码;如果返回值是byte类型则表示写字画画时的动作信号;0x00
* 表示停止动作,0x01 表 示开始执行动作,0x02 表示暂停动作
*/
public static Object getArmEngraveMovementSignal() {
ByteByReference b = new ByteByReference();
int status = DllInterface.INSTANCE.GetArmEngraveMovementSignal(b);
if (status != PACKETTXRXSUCCEED) {
return status;
} else {
return b.getValue();
}
} /**
* 向嵌入式端发送激光雕刻的图片的路径数据
*
* @param laserlevel
* 表示激光功率的等级,0x00 表示关闭激光头,0x01 表示 FirSca,0x02 表示SecSca,0x03
* 表示ThirdSca 最大功率
* @param pathtype
* 表示的是路径的类型,m 表示路径的起点;l 表示路径点(调用 时使用十六进制的ASCII
* 值:m(0x6D),l(0x6C))
* @param goalcoor
* 长度为3的float[],数组元素分别对应目标点的x,y,z 的坐标
* @return PACKETTXRXSUCCEED 表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表
*/
public static int sendEngravePathData(byte laserlevel, byte pathtype, float[] goalcoor) {
int status = DllInterface.INSTANCE.SendEngravePathData(laserlevel, pathtype, goalcoor);
return status;
} /**
* 设置目标坐标(以直线运动到目标点)
*
* @param movMethod
* 表示运动方式,当moveMethod为TIME_MOVE_METHOD时,表示以时间的方式运动到目标位置;
* 当moveMethod为SPEED_MOVE_METHOD时, 表示以速度的方式运动到目标位置
* @param value
* 表示时间或者速度,当moveMethod为TIME_MOVE_METHOD时,表示时间;
* 当moveMethod为SPEED_MOVE_METHOD时,此时value值无效。
* @param goalcoor
* 表示执行端x,y,z的坐标。
* @return PACKETTXRXSUCCEED 表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表
*/
public static int setGoalCoordinateTrajectoryLine(byte movMethod, float value, float[] goalcoor) {
int status = DllInterface.INSTANCE.SetGoalCoordinateTrajectoryLine(movMethod, value, goalcoor);
return status;
} /**
* 设置目标坐标(以门型轨迹运动到目标点)
*
* @param doorheight
* 表示门型运动中门的高度
* @param speedrate
* 表示速度的倍率;当速度的倍率为1.0时,机械臂会以最快的
* 速度从当前位置以门型的方式运动到目标位置;speedrate存在最大倍 率和最小倍率
* @param goalcoor
* 表示执行端目标位置的x,y,z的坐标。
* @return PACKETTXRXSUCCEED 表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表。
*/
public static int setGoalCoordinateTrajectoryDoor(float doorheight, float speedrate, float[] goalcoor) {
int status = DllInterface.INSTANCE.SetGoalCoordinateTrajectoryDoor(doorheight, speedrate, goalcoor);
return status;
} /**
* 设置轨迹运动的速度
*
* @param speed
* speed表示轨迹运动中机械臂每秒走过的距离,speed存在最大值和最 小值
* @return PACKETTXRXSUCCEED 表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表。
*/
public static int setTrajectoryMovementSpeed(float speed) {
int status = DllInterface.INSTANCE.SetTrajectoryMovementSpeed(speed);
return status;
} /**
* 发送轨迹数据
*
* @param ex
* ex 表示对轨迹数据的处理方式。当ex=0 时,表示存储轨迹数据;当 ex=1 时,表示执行轨迹数据;当ex=2
* 时,表示执行已经存储好的轨 迹数据
* @param flag
* 表示的是路径的类型,POINT_TYPE_START 表示路径的起点;POINT_TYPE_COMMON 表示路径点
* @param goalcoor
* 表示执行端目标位置的x,y,z的坐标。
* @return PACKETTXRXSUCCEED 表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表。
*/
public static int sendTrajectoryData(byte ex, byte flag, float[] goalcoor) {
int status = DllInterface.INSTANCE.SendTrajectoryData(ex, flag, goalcoor);
return status;
} /**
* 设置指令队列的运行方式
*
* @param type
* type表示指令队列的运行方式 当type=0x01时,表示启动指令队列,依次运行队列中的指令
* 当type=0x02时,表示停止指令队列运行,不过机械臂会将当前指令执 行完才丢弃后续的指令
* 当type=0x03时,表示立刻停止指令队列运行,此时机械臂会终止当前 指令的执行,并丢弃后续的指令
* @return PACKETTXRXSUCCEED 表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表。
*/
public static int setCommandQueueExecuteMethod(byte type) {
int status = DllInterface.INSTANCE.SetCommandQueueExecuteMethod(type);
return status;
} /**
* 设置指令队列的下载方式
*
* @param type
* type表示指令队列的下载控制方式 当type=0x01时,表示启动指令队列下载,将指令队列下载到控制器的 外部flash中
* 当type=0x02时,表示停止指令队列下载,用于告诉控制器指令队列已 经发送完毕
* 当type=0x03时,表示立刻取消指令队列的下载,此时机械臂可能会还 没有接收完指令队列
* @return PACKETTXRXSUCCEED 表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表。
*/
public static int setCommandQueueDownloadMethod(byte type) {
int status = DllInterface.INSTANCE.SetCommandQueueDownloadMethod(type);
return status;
} /**
* 通知控制器清空指令队列
*
* @param type
* type对应清理的位置 type=0x00表示清除所有空间的指令队列 type=0x01表示清空控制器RAM中的指令队列
* type=0x02表示清空控制器外部flash中的指令队列
* @return PACKETTXRXSUCCEED 表示函数正常执行完,其他的返回码分别对 应不同的错误,请参见错误列表。
*/
public static int clearCommandQueue(byte type) {
int status = DllInterface.INSTANCE.ClearCommandQueue(type);
return status;
} /**
* 获取指令队列的信息
*
* @param type
* type 表示需要获取的信息类型 当type=0x01 时,表示获取当前指令在指令队列中的索引位置 ,当type=0x02
* 时,表示获取用于存放指令队列的RAM剩余的空间 (注:这里是按照一个指令包的内存空间作为单位的,不是以字节 作为单位的)
* @return 当返回类型为int类型时,PACKETTXRXSUCCEED 表示函数正常执行完,其他的返回码分别对
* 应不同的错误,请参见错误列表。当返回值为byte类型时,type=0x01时可返回当前指令在指令队列中的索引位置,当type=
* 0x02时表示获取用于存放指令队列的RAM剩余的空间
*/
public static Object getCommandQueueInformation(byte type) {
ByteByReference b = new ByteByReference();
int status = DllInterface.INSTANCE.GetCommandQueueInformation(type, b);
if (status != PACKETTXRXSUCCEED) {
return status;
} else {
return b.getValue();
}
}
}

在java程序中,我们直接调用这个类里面的方法都可以了。

Java中jna的用法的更多相关文章

  1. java中this的用法?

    2008-07-28 08:10cztx5479 | 分类:JAVA相关 | 浏览4533次 java中this的用法? import java.awt.*; import java.awt.even ...

  2. 转:十八、java中this的用法

    http://blog.csdn.net/liujun13579/article/details/7732443 我知道很多朋友都和我一样:在JAVA程序中似乎经常见到“this”,自己也偶尔用到它, ...

  3. Java 中 synchronized的用法详解(四种用法)

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码.本文给大家介绍java中 synchronized的用法,对本文感兴趣的朋友一起看看吧 ...

  4. java成神之——java中string的用法

    java中String的用法 String基本用法 String分割 String拼接 String截取 String换行符和format格式化 String反转字符串和去除空白字符 String获取 ...

  5. java中stringBuilder的用法

    java中stringBuilder的用法 String对象是不可改变的.每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需 ...

  6. 第一篇 网站基础知识 第4章 Java中Socket的用法

    第4章 Java中Socket的用法 4.1 普通Socket的用法 Java中的网络通信是通过Socket实现的,Socket分为ServetSocket和Socket两大类,ServetSocke ...

  7. Java中的Socket用法

    转发链接:https://www.cnblogs.com/zhanglei93/p/6217384.html (1)Java中的Socket用法 Java中的Socket分为普通的Socket和Nio ...

  8. java中jna使用回调实现事件监听器——观察者模式

    (1)C接口中的接口头文件 #pragma once #include <iostream> #include <vector> #include <core/core. ...

  9. 初探java中this的用法

    一般this在各类语言中都表示“调用当前函数的对象”,java中也存在这种用法: public class Leaf { int i = 0; Leaf increment(){ i++; retur ...

随机推荐

  1. 倾斜摄影实景三维在智慧工厂 Web 3D GIS 数字孪生应用

      数字化推动钢铁工业转型升级 数字时代,随着数字地球,数字中国,数字工厂等数字化建设的不断深入,以地理信息系统(Geographic Information System, GIS)为基础,融合大数 ...

  2. moviepy用VideoFileClip加载视频时报UnicodeDecodeError: codec cant decode ,No mapping character 错误

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 昨天处理视频时出现了解码错误,通过修改ffmpeg ...

  3. 转:Http协议中Cookie详细介绍

    Http协议中Cookie详细介绍 Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie.内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了, ...

  4. Python调用云服务器AWVS13API接口批量扫描(指哪打哪)

    最近因为实习的原因,为了减少一部分的工作量,在阿里云服务器上搭建了AWVS扫描器 方便摸鱼 但是发现AWVS貌似没有批量添加的方法,作者只好把整理的URL.txt捏了又捏 手动输入是不可能手动输入的, ...

  5. python学生管理名片

    name=['刘备','关羽','张飞','赵云','马超'] print('名片管理系统1.0\n1.增加一个新的名片\n2.删除一个名片\n3.修改一个名片\n4.查找一个名片\n5.退出名片管理 ...

  6. 百度前端技术学院-基础-day7.8

    任务:参考如下设计稿实现HTML页面及CSS样式 代码 点击预览 HTML 1 <!DOCTYPE html> 2 <html lang="en"> 3 & ...

  7. ip 子网掩码、网络地址、广播地址计算

    例:已知ip  16.158.165.91/22子网掩码 根据22 得知子网掩码占22位 即:11111111.11111111.11111100.00000000   == 255.255.252. ...

  8. I am zhoukangyang!

    我是 \(\texttt{zhoukangyang}\),一名来自浙江省,杭州市的初二菜鸡 \(\texttt{oier}\) . 洛谷zhoukangyang 很多东西因为太垃圾所以 了,要开 请洛 ...

  9. Acwing 120. 防线

    题目地址 题目简译:给定\(n\)个等差数列,每个等差数列的起点为\(s\),终点为\(e\),差为\(d\).整个序列中至多有一个位置所占数字是奇数.判断奇数位是否存在,如果不存在输出"T ...

  10. Java程序执行过程及内存机制

    本讲将介绍Java代码是如何一步步运行起来的,其中涉及的编译器,类加载器,字节码校验器,解释器和JIT编译器在整个过程中是发挥着怎样的作用.此外还会介绍Java程序所占用的内存是被如何管理的:堆.栈和 ...