2022-01-24 16:09:16 +00:00
|
|
|
|
package com.tencent.wework;
|
|
|
|
|
|
|
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
|
|
2022-04-26 11:30:44 +08:00
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
2022-01-24 16:09:16 +00:00
|
|
|
|
/**
|
2022-06-30 14:18:23 +08:00
|
|
|
|
* 企业微信会话内容存档Finance类
|
2022-01-24 16:09:16 +00:00
|
|
|
|
* 注意:
|
2022-06-30 14:18:23 +08:00
|
|
|
|
* 此类必须配置在com.tencent.wework路径底下,否则会报错:java.lang.UnsatisfiedLinkError: com.xxx.Finance.NewSdk()
|
2022-01-24 16:09:16 +00:00
|
|
|
|
* <p>
|
|
|
|
|
|
* Q:JAVA版本的sdk报错UnsatisfiedLinkError?
|
|
|
|
|
|
* A:请检查是否修改了sdk的包名。
|
|
|
|
|
|
* <p>
|
2023-06-06 23:35:45 +08:00
|
|
|
|
* <a href="https://developer.work.weixin.qq.com/document/path/91552">官方文档</a>
|
2022-01-24 16:09:16 +00:00
|
|
|
|
*
|
2022-08-25 16:47:47 +08:00
|
|
|
|
* @author <a href="https://github.com/0katekate0">Wang_Wong</a> created on 2022-01-17
|
2022-01-24 16:09:16 +00:00
|
|
|
|
*/
|
|
|
|
|
|
@Slf4j
|
|
|
|
|
|
public class Finance {
|
|
|
|
|
|
|
|
|
|
|
|
private static volatile long sdk = -1L;
|
|
|
|
|
|
private static Finance finance = null;
|
|
|
|
|
|
private static final String SO_FILE = "so";
|
|
|
|
|
|
private static final String DLL_FILE = "dll";
|
|
|
|
|
|
|
2023-06-06 23:35:45 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* New sdk long.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return the long
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native long NewSdk();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 初始化函数
|
|
|
|
|
|
* Return值=0表示该API调用成功
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param sdk the sdk
|
|
|
|
|
|
* @param corpid the corpid
|
|
|
|
|
|
* @param secret the secret
|
|
|
|
|
|
* @return 返回是否初始化成功 0 - 成功 !=0 - 失败
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native int Init(long sdk, String corpid, String secret);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 拉取聊天记录函数
|
|
|
|
|
|
* Return值=0表示该API调用成功
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param sdk the sdk
|
|
|
|
|
|
* @param seq the seq
|
|
|
|
|
|
* @param limit the limit
|
|
|
|
|
|
* @param proxy the proxy
|
|
|
|
|
|
* @param passwd the passwd
|
|
|
|
|
|
* @param timeout the timeout
|
|
|
|
|
|
* @param chatData the chat data
|
|
|
|
|
|
* @return 返回是否调用成功 0 - 成功 !=0 - 失败
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native int GetChatData(long sdk, long seq, long limit, String proxy, String passwd, long timeout, long chatData);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 拉取媒体消息函数
|
|
|
|
|
|
* Return值=0表示该API调用成功
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param sdk the sdk
|
|
|
|
|
|
* @param indexbuf the indexbuf
|
|
|
|
|
|
* @param sdkField the sdk field
|
|
|
|
|
|
* @param proxy the proxy
|
|
|
|
|
|
* @param passwd the passwd
|
|
|
|
|
|
* @param timeout the timeout
|
|
|
|
|
|
* @param mediaData the media data
|
|
|
|
|
|
* @return 返回是否调用成功 0 - 成功 !=0 - 失败
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native int GetMediaData(long sdk, String indexbuf, String sdkField, String proxy, String passwd, long timeout, long mediaData);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 解析密文
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param sdk the sdk
|
|
|
|
|
|
* @param encrypt_key the encrypt key
|
|
|
|
|
|
* @param encrypt_msg the encrypt msg
|
|
|
|
|
|
* @param msg the msg
|
|
|
|
|
|
* @return 返回是否调用成功 0 - 成功 !=0 - 失败
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native int DecryptData(long sdk, String encrypt_key, String encrypt_msg, long msg);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Destroy sdk.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param sdk the sdk
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native void DestroySdk(long sdk);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* New slice long.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return the long
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native long NewSlice();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 释放slice ,和NewSlice成对使用
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param slice the slice
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native void FreeSlice(long slice);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取slice内容
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param slice the slice
|
|
|
|
|
|
* @return 内容 string
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native String GetContentFromSlice(long slice);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取slice内容长度
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param slice the slice
|
|
|
|
|
|
* @return 内容 int
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native int GetSliceLen(long slice);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* New media data long.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return the long
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native long NewMediaData();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Free media data.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param mediaData the media data
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native void FreeMediaData(long mediaData);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取 mediadata outindex
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param mediaData the media data
|
|
|
|
|
|
* @return outindex string
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native String GetOutIndexBuf(long mediaData);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取 mediadata data数据
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param mediaData the media data
|
|
|
|
|
|
* @return data byte [ ]
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native byte[] GetData(long mediaData);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Get index len int.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param mediaData the media data
|
|
|
|
|
|
* @return the int
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native int GetIndexLen(long mediaData);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Get data len int.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param mediaData the media data
|
|
|
|
|
|
* @return the int
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native int GetDataLen(long mediaData);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Is media data finish int.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param mediaData the media data
|
|
|
|
|
|
* @return 1完成 、0未完成
|
|
|
|
|
|
* 判断mediadata是否结束
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static native int IsMediaDataFinish(long mediaData);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 判断Windows环境
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return boolean boolean
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static boolean isWindows() {
|
2022-01-24 16:09:16 +00:00
|
|
|
|
String osName = System.getProperties().getProperty("os.name");
|
|
|
|
|
|
log.info("Loading System Libraries, Current OS Version Is: {}", osName);
|
|
|
|
|
|
return osName.toUpperCase().contains("WINDOWS");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-06 23:35:45 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 加载系统类库
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param libFiles 类库配置文件
|
|
|
|
|
|
* @param prefixPath 类库文件的前缀路径
|
|
|
|
|
|
*/
|
|
|
|
|
|
public Finance(List<String> libFiles, String prefixPath) {
|
2022-01-24 16:09:16 +00:00
|
|
|
|
boolean isWindows = Finance.isWindows();
|
|
|
|
|
|
for (String file : libFiles) {
|
|
|
|
|
|
String suffix = file.substring(file.lastIndexOf(".") + 1);
|
|
|
|
|
|
if (isWindows) {
|
|
|
|
|
|
// 加载dll文件
|
|
|
|
|
|
if (suffix.equalsIgnoreCase(DLL_FILE)) {
|
|
|
|
|
|
System.load(prefixPath + file);
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 加载so文件
|
|
|
|
|
|
if (suffix.equalsIgnoreCase(SO_FILE)) {
|
|
|
|
|
|
System.load(prefixPath + file);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-06 23:35:45 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 初始化类库文件
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param libFiles the lib files
|
|
|
|
|
|
* @param prefixPath the prefix path
|
|
|
|
|
|
* @return finance finance
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static synchronized Finance loadingLibraries(List<String> libFiles, String prefixPath) {
|
2022-01-24 16:09:16 +00:00
|
|
|
|
if (finance != null) {
|
|
|
|
|
|
return finance;
|
|
|
|
|
|
}
|
|
|
|
|
|
finance = new Finance(libFiles, prefixPath);
|
|
|
|
|
|
return finance;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-06 23:35:45 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 单例sdk
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return long
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static synchronized long SingletonSDK() {
|
2022-01-24 16:09:16 +00:00
|
|
|
|
if (sdk > 0) {
|
|
|
|
|
|
return sdk;
|
|
|
|
|
|
}
|
|
|
|
|
|
sdk = Finance.NewSdk();
|
|
|
|
|
|
return sdk;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-06-06 23:35:45 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 销毁sdk,保证线程可见性
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param destroySDK the destroy sdk
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static synchronized void DestroySingletonSDK(long destroySDK) {
|
2022-01-24 16:09:16 +00:00
|
|
|
|
sdk = 0L;
|
|
|
|
|
|
Finance.DestroySdk(destroySDK);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|