1.相关文档地址

2.相关demo代码

代码部分作了修改,使用了commons-io中的IOUtils.toString简化了io操作

public class Demo {

    public static void main(String args[]) throws Exception {

        tls_sigcheck demo = new tls_sigcheck();

        // 使用前请修改动态库的加载路径
// demo.loadJniLib("D:\\src\\oicq64\\tinyid\\tls_sig_api\\windows\\64\\lib\\jni\\jnisigcheck.dll");
demo.loadJniLib("/home/tls/tls_sig_api/src/jnisigcheck.so"); String priKey;
try (InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("ec_key.pem")) {
priKey = IOUtils.toString(in, "utf-8");
}
int ret = demo.tls_gen_signature_ex2("1400000267", "xiaojun", priKey); if (0 != ret) {
System.out.println("ret " + ret + " " + demo.getErrMsg());
} else {
System.out.println("sig:\n" + demo.getSig());
} String pubKey;
try (InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("public.pem")) {
pubKey = IOUtils.toString(in, "utf-8");
}
ret = demo.tls_check_signature_ex2(demo.getSig(), pubKey, "1400000267", "xiaojun");
if (0 != ret) {
System.out.println("ret " + ret + " " + demo.getErrMsg());
} else {
System.out.println("--\nverify ok -- expire time " + demo.getExpireTime() + " -- init time " + demo.getInitTime());
}
}
}

从上述代码可以知道,java接口是使用jni的方式,并且在linux环境下使用了jnisigcheck.so,相关下载

微云分享>TLS后台API>20151230下面的tls_sig_api-linux-32.tar.gz或者tls_sig_api-linux-64.tar.gz,解压后,在目录lib/jni中可以获取。很遗憾,mac中不能直接使用,会报一下错误(以tls_sig_api-linux-64中的jnisigcheck.so为例):

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/tls/tls_sig_api/src/jnisigcheck.so: dlopen(/home/tls/tls_sig_api/src/jnisigcheck.so, 1): no suitable image found.  Did find:
/home/tls/tls_sig_api/src/jnisigcheck.so: unknown file type, first eight bytes: 0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1938)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1821)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at com.tls.sigcheck.tls_sigcheck.loadJniLib(tls_sigcheck.java:10)
at com.xiaobenma020.main(Demo.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

因此在mac中,需要重新编译生成jnisigcheck.so

3.jnisigcheck.so编译步骤

3.1下载TLS相关源码,下载地址

微云分享>TLS后台API>20151230>tls_sig_api-src.tar.gz

3.2 解压tls_sig_api-src.tar.gz之后,进入src目录,查看Makefile

CPP = g++
CC = gcc
ARCH=$(shell getconf LONG_BIT)
CFLAGS= -g -I../include -I../include/tls_sig_api -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -Wall -fPIC
LIBS= ../linux/$(ARCH)/lib/jsoncpp/libjsoncpp.a ../openssl-dynamic/lib/libcrypto.a -ldl -lz
TARGETS = libtlsignature.a sigcheck.so signature all: $(TARGETS) libtlsignature.a: tls_signature.o multi_thread.o base64.o base64_url.o
ar -rs $@ $^ # jni 库编译前请安装 jdk,并且配置 JAVA_HOME 环境变量
jni: com_tls_sigcheck_tls_sigcheck.o libtlsignature.a
g++ -shared -o jnisigcheck.so $^ ../linux/$(ARCH)/lib/jsoncpp/libjsoncpp.a ../openssl-dynamic/lib/libcrypto.a -lz signature: signature.o libtlsignature.a
g++ -o $@ $^ ../linux/$(ARCH)/lib/jsoncpp/libjsoncpp.a ../openssl-dynamic/lib/libcrypto.a -ldl -lz sigcheck.so: sigcheck.o libtlsignature.a sigcheck.h
g++ -shared -fPIC -o $@ $^ ../linux/$(ARCH)/lib/jsoncpp/libjsoncpp.a ../openssl-dynamic/lib/libcrypto.a -ldl -lz .cpp.o:
$(CPP) $(CFLAGS) -c $*.cppmkd .c.o:
$(CC) $(CFLAGS) -c $*.c clean:
-rm -f *.o *.so *.a tls_licence_tools TAGS $(TARGETS)

可以看到使用make jni生成jnisigcheck.so。执行命令之后,并没有像我们想象那样生成了jnisigcheck.so,需要解决部分依赖库问题:jni_md.h,代码中的../linux/$(ARCH)/lib/jsoncpp/libjsoncpp.a ($(ARCH)=64)../openssl-dynamic/lib/libcrypto.a文件缺失问题。

3.3解决文件缺失问题

3.3.1 复制jni_md.h

cd /Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/include/ sudo darwin/jni_md.h ./

3.3.2 编译jsoncpptls_sig_api-src/jsoncpp-src-0.5.0)

参考Linux下编译Jsoncpp

//请认真读jsoncpp-src-0.5.0/README.txt

$ brew install scons
$ cd jsoncpp-src-0.5.0
$ python /usr/local/bin/scons platform=linux-gcc

执行的结果是在libs目录下生成了

linux-gcc-4.2.1/libjson_linux-gcc-4.2.1_libmt.a
linux-gcc-4.2.1/libjson_linux-gcc-4.2.1_libmt.dylib

3.3.3 编译openssl

参考build_openssl_dylib.sh

进入tls_sig_api-src目录

$ tar -xzvf openssl-1.0.2a.tar.gz
$ mv openssl-1.0.2a openssl_x86_64
$ cd openssl_x86_64
$ ./Configure darwin64-x86_64-cc -shared
$ make

则在当前目录生成了libcrypto.a

3.3.4 链接依赖库

进入tls_sig_api-src/src

$ mkdir -p ../linux/64/lib/jsoncpp
$ ln -s `cd ..;pwd`/jsoncpp-src-0.5.0/libs/linux-gcc-4.2.1/libjson_linux-gcc-4.2.1_libmt.a ../linux/64/lib/jsoncpp/libjsoncpp.a
$ mkdir -p ../openssl-dynamic/lib/
$ ln -s `cd ..;pwd`/openssl_x86_64/libcrypto.a ../openssl-dynamic/lib/libcrypto.a

创建link的时候,source需要填写绝对路径,所以才有上述cd ..;pwd

3.4 编译jnisigcheck.so

在src目录下,执行一下命令,则生成`jnisigcheck.so`
$ make clean
$ make jni

腾讯云>>云通信>>TLS后台API在mac上JAVA DEMO搭建的更多相关文章

  1. 云-腾讯云-云通信:云通信(IM)

    ylbtech-云-腾讯云-云通信:云通信(IM) 企业数字化转型的通信助手,让通信触达全球,智联万物 1.返回顶部 1. 云通信(Instant Messaging,IM)承载亿级 QQ 用户即时通 ...

  2. 每天响应数亿次请求,腾讯云如何提供高可用API服务?

    每天响应数亿次请求,腾讯云如何提供高可用API服务? https://mp.weixin.qq.com/s/OPwlHcqkaTT_gcwHfr5Shw 李阳 云加社区 2020-09-16 导语 | ...

  3. 腾讯云即时通信 IM 服务 实例项目

    腾讯云即时通信 IM 服务  https://github.com/tencentyun/TIMSDK

  4. 聚焦小游戏技术生态,腾讯游戏云GAME-TECH落地厦门

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云 发表于云+社区专栏 2018迎来了小游戏元年,据<2018年小游戏行业白皮书>显示:2018年小游戏市场规模预 ...

  5. JavaWeb-SpringBoot_(上)腾讯云点播服务之视频的上传-demo

    使用Gradle编译项目 传送门 腾讯视频云点播 传送门 项目已托管到Github上 传送门 腾讯云点播服务之视频的显示(下) 传送门 个人腾讯云控制台中的视频管理 IndexController.j ...

  6. 云-腾讯云-云点播:云点播(VOD)

    ylbtech-云-腾讯云-云点播:云点播(VOD) 提供端到端的一站式VpaaS音视频点播解决方案 1.返回顶部 1. 云点播(Video on Demand,VOD)基于腾讯多年技术积累与基础设施 ...

  7. Java对接拼多多开放平台API(加密上云等全流程)

    前言 本文为[小小赫下士 blog]原创,搬运请保留本段,或请在醒目位置设置原文地址和原作者. 作者:小小赫下士 原文地址:Java对接拼多多开放平台API(加密上云等全流程) 本文章为企业ERP(I ...

  8. 基于腾讯Centos7云服务器搭建SVN版本控制库

    基于腾讯Centos7云服务器搭建SVN版本控制库 最近在和小伙伴组队参加一个关于人工智能的比赛,无奈不知道怎么处理好每个人的代码托管问题,于是找到了晚上免费svn托管服务器的服务,但是所给的免费空间 ...

  9. 「小程序JAVA实战」小程序和后台api通信(28)

    转自:https://idig8.com/2018/08/19/xiaochengxujavashizhanxiaochengxuhehoutaiapitongxin28/ 开发最重要的就是实操! 小 ...

随机推荐

  1. [Android Tips] 21. Regex Named Groups in Android

    Android SDK 并没有包含 Java 7 新增加的命名捕获组功能,需要使用第三方库 https://github.com/tony19/named-regexp import com.goog ...

  2. Glacierskating测试记录

    这个游戏本身已经很成熟了,要提什么建议的话也是吹毛求疵.... 不过个人来讲不是很喜欢这个游戏,喜欢程度排倒数第二吧....感觉游戏就是一个套路,掌握了套路就不好玩了.....优点是随时随地可以玩一把 ...

  3. 一个简单的配置管理器(SettingManager)

    在很多.net开发的项目中,我们几乎都会使用到一些自定义的参数,比如说第三方的配置参数之类的. 他们的特点是:1.系统全局 2,可以做成键值对(Dictionary). 我们可以将这些参数放到Web. ...

  4. MFC Picture控件加载图片

    CStatic *pPic = (CStatic*)GetDlgItem(IDC_PICTURE); CBitmap bitmap; bitmap.LoadBitmapW(IDB_BITMAP2); ...

  5. FileSaver.js ////////////////////zzzzzzzzzzzzzz

    FileSaver.js 实现浏览器端文件保存的 JavaScript 库 查看次数: 758 下载次数: 89 更新时间: 2015-06-05 发布时间: 2015-06-05 收藏 插件信息金币 ...

  6. gulp外挂 uglify 的使用

    1.js文件压缩 第一步:安装外挂 :  第二步:gulpfile.js 配置 : (首先看你的package.json 中有没有添加依赖,如果有 这一句,代表添加成功啦.) 输入以下代码 : var ...

  7. 代码review之 isInfoEnable()

    上周没事扫扫系统原来的代码,突然发现这样一段代码: if(log.isInfoEnable()) { log.info("ID"+userID+"pwd"+us ...

  8. jQuery 获取当前节点的html包含当前节点的方法

    在开发过程中,jQuery.html() 是获取当前节点下的html代码,并不包含当前节点本身的代码,然后我们有时候确需要,找遍jQuery api文档也没有任何方法可以拿到. 看到有的人通过pare ...

  9. Ubuntu14.04台式机r8169有线网卡驱动问题

    由于台式在安装了Ubuntu14.04后插入网线后灯不亮,不能使用有线网. 查找资料发现原来是网卡驱动问题,解决办法如下: 1.查看网卡驱动名称 lspci -v 找到以太网连接的kernel dri ...

  10. Excel应该这么玩——5、三种数据:Excel也是系统

        Excel最常用的功能就是记录数据,把数据按照行列记录下来.这部分数据是源数据,是业务活动中最原始的流水账,作为后续操作的依据.为了从源数据中得出一定的结论,需要对源数据进行分析得出报表数据. ...