设为首页 收藏本站
查看: 1227|回复: 0

[经验分享] 腾讯云>>云通信>>TLS后台API在mac上JAVA DEMO搭建

[复制链接]

尚未签到

发表于 2017-7-7 12:19:04 | 显示全部楼层 |阅读模式
1.相关文档地址

2.相关demo代码
  代码部分作了修改,使用了commons-io中的IOUtils.toString简化了io操作
public>
  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 编译jsoncpp(tls_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
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-391230-1-1.html 上篇帖子: mac安装以及删除mysql5.7 下篇帖子: 为效率而生:开源Mac版Google Authenticator认证客户端GoldenPassport
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表