【Java】native方法的使用

灵感

最近在做关于企业微信的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: 成功
     *            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值