灵感
最近在做关于企业微信的sdk调用,发现腾子是提供了C++写的库来给Java调用,感觉特别酷炫,所以有感而发想自己实现一个
我们先看看腾讯他们的Java类
package com.tencent.wework;
/**
* @link <https://developer.work.weixin.qq.com/document/path/100010> 上线前需要下载此文件,放在jvm运行目录
* @link <https://developer.work.weixin.qq.com/document/path/100250> 上线前需要下载此文件,放在jvm运行目录
* @warning: 1. 不要修改成员变量名,native方法内有反射调用
* 2. 调用本地方法需保持包结构,本工具需放在包com.tencent.wework内
* 3. 不允许继承,类名和函数名均不可修改,会影响本地方法的引用,详见:javah生成本地方法头文件
*/
public final class SpecSDK {
/**
* @description 调用本地方法后实例化的对象指针
*/
private long specSDKptr = 0;
/**
* @usage invoke的请求
* @example "{\"limit\":1}
*/
private String request;
public void SetRequest(String request) {
this.request = request;
}
/**
* @usage 访问上一次invoke的结果
*/
private String response;
public String GetResponse() {
return response;
}
/**
* @param corpid: 企业corpid,必选参数
* @param agentid: 应用id,必选参数
* @param ability_id: 能力ID,可选参数
* @param job_info: job_info,可选参数
* */
public SpecSDK(String corpId, long agentId) {
specSDKptr = NewSDK1(corpId, agentId);
}
private native long NewSDK1(String corpId, long agentId);
public SpecSDK(String corpId, long agentId, String abilityId) {
specSDKptr = NewSDK2(corpId, agentId, abilityId);
}
private native long NewSDK2(String corpId, long agentId, String abilityId);
/**
*
参数 类型 说明
corpId String 授权企业的corpid
agentId long 应用的agentid这个应用的身份调用
仅当调用上报异步任务结果接口,且该次任务在接受请求时并没有接收到应用的agentid时,可能没有应用的身份,此时填写0即可
abilityId String 程序使用的能力id
jobInfo String 用于关联异步任务的任务信息,仅当调用上报异步任务结果时必填,具体内容在接受到企微后台发起的请求时获取,参考企微后台调用专区-Java版本-获取请求参数-Java部分
调用其他接口时填写空串即可
* @param corpId
* @param agentId
* @param abilityId
* @param jobInfo
*/
public SpecSDK(String corpId, long agentId, String abilityId, String jobInfo) {
specSDKptr = NewSDK3(corpId, agentId, abilityId, jobInfo);
}
private native long NewSDK3(String corpId, long agentId, String abilityId, String jobInfo);
/**
* @description 使用callback的请求来初始化
* @param callback_sdk: 要求IsOk()==true
* @return C++内部指针,创建失败时指针仍为0,并输出错误日志
* */
public SpecSDK(SpecCallbackSDK callbackSDK) {
specSDKptr = NewSDK4(callbackSDK.GetPtr());
}
private native long NewSDK4(long callbackSDK);
/**
* @usage 在Java对象的内存回收前析构C++对象
*/
@Override
protected void finalize() throws Throwable {
DeleteCPPInstance(specSDKptr);
super.finalize();
}
private native void DeleteCPPInstance(long specSDKptr);
/**
* @description 用于在专区内调用企业微信接口
* @param api_name 接口名
* @param request json格式的请求数据
* @param response json格式的返回数据
* @return errorcode 参考如下:
* 0: 成功
*