代码部分做了修改,使用了commons-io
中的IOUtils.toString
简化了io
操做java
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
为例):python
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
。linux
jnisigcheck.so
编译步骤微云分享
>TLS后台API
>20151230
>tls_sig_api-src.tar.gz
git
tls_sig_api-src.tar.gz
以后,进入src目录,查看MakefileCPP = 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
文件缺失问题。github
3.3.1 复制jni_md.h
shell
cd /Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/include/ sudo darwin/jni_md.h ./
json
3.3.2 编译jsoncpp
(tls_sig_api-src/jsoncpp-src-0.5.0
)windows
参考Linux下编译Jsoncppapi
//请认真读jsoncpp-src-0.5.0/README.txt
app
$ 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
进入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
。
jnisigcheck.so
在src目录下,执行一下命令,则生成`jnisigcheck.so` $ make clean $ make jni