企业微信会话存档功能开发

企业微信会话存档功能开发

概述

使用前帮助

## 环境

开发:win10 部署: linux

sdk下载

把动态库拷贝到lib目录下面,Financ类放在com.tencent.wework包下面(必须的)

动态库加载

/**
	 * 加载动态库
	 * /lib 或者usr/lib 或者{JAVA_HOME}/jre/bin 等
	 */
	static {
          
   
		List<String> libs = new ArrayList<>();
		String property = System.getProperty("os.name","linux");
		if(property.toLowerCase().startsWith("win")){
          
   
			libs.add("libssl-1_1-x64.dll");
			libs.add("libcurl-x64.dll");
			libs.add("libcrypto-1_1-x64.dll");
			libs.add("WeWorkFinanceSdk.dll");
		}else{
          
   
			libs.add("libWeWorkFinanceSdk_Java.so");
		}
		libs.forEach(Finance::loadDynamicLibrary);
	}

	//对junit测试环境单独处理
	private static void loadDynamicLibrary(String s) {
          
   
		String resourcePath = ResourceUtils.CLASSPATH_URL_PREFIX + "lib/"+ s;
		if(isUnitTest()){
          
   
			loadDevJarDynamicLibrary(resourcePath);
		}else{
          
   
			loadJarDynamicLibrary(resourcePath,s);
		}

	}

	/**
	 * junit测试环境
	 * @param classpath
	 */
	private static void loadDevJarDynamicLibrary(String classpath) {
          
   
		URL url = null;
		try {
          
   
			url = ResourceUtils.getURL(classpath);
		} catch (FileNotFoundException e) {
          
   
			log.error("loadDynamicLibraryInSpring error,classpath={}",classpath,e);
			return;
		}
		String path = url.getPath();
		log.info("开始加载动态库classpath={},path={}",classpath,path);
		System.load(path);
	}

	/**
	 * 加载jar包里面的lib
	 * @param classpath classpath:lib/aaa.so
	 * @param filename aaa.so
	 */
	private static void loadJarDynamicLibrary(String classpath, String filename) {
          
   
		ApplicationHome applicationHome = new ApplicationHome(Finance.class);
		String rootPath = applicationHome.getSource().getParentFile().toString();
		String path = rootPath+ File.separator+filename;
		File file = new File(path);
		if(file.exists()){
          
   
			log.info("已经存在动态库file={}",file.getAbsolutePath());
		}
		try {
          
   
			URL url = ResourceUtils.getURL(classpath);
			InputStream inputStream = url.openConnection().getInputStream();
			FileUtils.copyInputStreamToFile(inputStream,file);
			String absolutePath = file.getAbsolutePath();
			log.info("开始加载动态库path={}",absolutePath);
			System.load(absolutePath);
		} catch (Exception e) {
          
   
			log.error("动态库拷贝error,classpath={},filename={}",classpath,filename);
		}
	}

	/**
	 * 是否是junit测试
	 * @return
	 */
	private static boolean isUnitTest() {
          
   
		try {
          
   
			StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
			for (int i = stackTrace.length - 1; i >= 0; i--) {
          
   
				if (stackTrace[i].getClassName().startsWith("org.junit.")) {
          
   
					return true;
				}
			}
		}
		catch (Exception ex) {
          
   
			log.error("isUnitTest error",ex);
		}
		return false;
	}

问题: 1.动态库加载的区别 System.load(absolutePath);//加载全路径文件,后面带dll或者so System.loadLibrary(libName);//加载动态库,只用名字,不带路径和dll或者so 2.为什么要把文件考出来

    不考出来其实也是能得到文件路径的,得到的的是 /app/jar/app.jar/…/xxx.so,是不能直接加载jar包里面的动态库的 考出来可以兼容windows和linux环境

demo

输入参数直接运行

返回结果解密(未完成)

经验分享 程序员 微信小程序 职场和发展