zoukankan      html  css  js  c++  java
  • 腾讯云>>云通信>>TLS后台API在mac上JAVA DEMO搭建

    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:
    " + 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("--
    verify 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
    
  • 相关阅读:
    景瑞地产商业智能BI整体实施过程
    域名访问和IP访问问题
    sitemesh定义多个装饰器
    8.8.2 EXPLAIN Output Format 优化输出格式
    Python_List对象内置方法详解
    Python_List对象内置方法详解
    Python_序列对象内置方法详解_String
    Python_序列对象内置方法详解_String
    CentOS设置服务开机启动的两种方法
    perl 没有关键文件句柄引起的逻辑错误
  • 原文地址:https://www.cnblogs.com/javaDeveloper/p/6098145.html
Copyright © 2011-2022 走看看