先看这样一个C接口
typedef struct _stPayResult
{
enPlace place = SD_D_PLACE_BUTT; //收单机构
const char* errCode = NULL; //错误码
const char* errInfo = NULL; //错误信息
const char* seqId = NULL; //平台流水号
const char* merOrderId = NULL; //商户订单号
const char* srcReserve = NULL; //请求系统预留字段
const char* attachedData = NULL; //商户附加数据
const char* totalAmount = NULL; //订单金额
const char* couponAmount = NULL; //优惠金额
const char* payAmount = NULL; //实付金额
const char* payTime = NULL; //支付时间
const char* orderCreateTime = NULL; //订单创建时间
const char* status = NULL; //交易状态
}stPayResult;
typedef void(*OnPayResult)(stPayResult* pstPayResult);
size_t SDPALMPAYPOSAPI Init(const char* pcPayDeviceIP, unsigned short usTlsPort, OnPayResult onPayResult)
接口用于初始化SDK并设置了回调函数。回调函数的参数是一个结构体的指针,首先,我们来看一下C中如何调用该接口
void PayResult(stPayResult* pstPayResult)
{
printf("errCode:%s, errInfo:%s\n", pstPayResult->errCode, pstPayResult->errInfo);
}
int main(int argc, char**argv)
{
Init("127.0.0.1", 443, PayResult);
}
调用方法非常的简单粗暴,接下来,我们看一下JAVA中JNA是如何实现调用的。
接口定义
long Init(String pcPayDeviceIP, int usTlsPort, OnPayResult onPayResult);
结构体定义
package com.saintdeem;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
public class stPayResult extends Structure {
public int place = enPlace.SD_D_PLACE_BUTT.getValue(); //收单机构
public String errCode; //错误码
public String errInfo; //错误信息
public String seqId; //平台流水号
public String merOrderId; //商户订单号
public String srcReserve; //请求系统预留字段
public String attachedData; //商户附加数据
public String totalAmount; //订单金额
public String couponAmount; //优惠金额
public String payAmount; //实付金额
public String payTime; //支付时间
public String orderCreateTime; //订单创建时间
public String status; //交易状态
public static class ByReference extends stPayResult implements
Structure. ByReference {
}
public static class ByValue extends stPayResult implements
Structure. ByValue {
}
/**
* 重写getFieldOrder获取字段列表
* @return
*/
@Override
protected List<String> getFieldOrder() {
return Arrays.asList("place", "errCode", "errInfo", "seqId", "merOrderId", "srcReserve", "attachedData", "totalAmount", "couponAmount", "payAmount", "payTime", "orderCreateTime", "status");
}
}
回调接口定义
import com.sun.jna.Callback;
public interface OnPayResult extends Callback {
void onPayResult(stPayResult.ByReference payResult);
}
回调实现类定义
private class OnPayResultImpl implements OnPayResult {
@Override
public void onPayResult(stPayResult.ByReference payResult) {
PayResult(payResult);
}
}
回调接口实现
@Override
final protected void PayResult(stPayResult.ByReference pstPayResult) {
System.out.printf("errCode:%s, errInfo:%s\n", pstPayResult.errCode, pstPayResult.errInfo);
}
调用
private OnPayResult onPayResult = new OnPayResultImpl();
SDPalmPayDevicePosSDKApi.instanceDll.Init("127.0.0.1", 443, onPayResult);
下一篇将介绍C#的调用方式