gmssl java_GMSSL编译运行Java Wrapper踩坑记录
在Mac上,按以下官方文檔的攻略是可以編譯通過的,但是在Linux上加上java就編譯失敗!
首先,按官方攻略把Mac流程跑通
//官方攻略BEGIN
編譯Java接口
由于GmSSL編譯腳本還不能實現在所有操作系統上自動編譯Java接口代碼,因此編譯腳本中默認沒有啟用Java接口的編譯。 開啟方式如下: 在源代碼根目錄下找到Configure文件,找到
$config{dirs} = [ "crypto", "ssl", "engines", "apps", "util", "tools", "fuzz", "test" ];
這一行,并將其修改為
$config{dirs} = [ "crypto", "ssl", "engines", "apps", "util", "tools", "fuzz", "test", "java" ];
重新編譯,則可以自動編譯java目錄下的C代碼和Java代碼,并生成libgmssljni動態庫和GmSSL.class。 這個模塊的編譯目前在Mac下可以測試通過。
在Linux和Mac下的編譯和安裝
./config
make
make test
sudo make install
//官方攻略End
在Mac上,編譯完成后能產生兩個dylib,一個是libgmssljni.dylib, 另一個是libcrypto.dylib
接著,把java目錄里頭的GmSSL.java 拿出來,切記切記,項目中要保持原文件中給出的package包路徑org.gmssl建目錄
在GmSSL.java底部的loadLibrary,指向的就是libgmssljni.dylib (Mac OS), 如果是Linux則是libgmssljni.so
static {
System.loadLibrary("gmssljni");
}
接著運行GmSSL中的main方法,注意,要在VMOption中添加java.library.path為上述libgmssljni.dylib和libcrypto.dylib所在目錄,例如:
-Djava.library.path=/Users/matt/Documents/securityworkspace/GmSSL
得到正確的運行結果
在Linux下的成功編譯經驗:
1、保持Configure文件中$config{dirs}原來的設置,不要添加java目錄,完成make install,會在GmSSL目錄內得到libcrypto.so
2、接著進入java目錄, 參考build.sh按下面的命令進行編譯,build.sh中-L /path/to/gmssl/lib 其實就是gmssl根目錄,加了lib有點誤導人
gcc -shared -fPIC -Wall -I./jni -I /home/java/gmssl/include -L /home/java/gmssl GmSSL.c -lcrypto -o libgmssljni.so
編譯成功,得到libgmssljni.so, 例如:
3、把步驟1中編譯出的libcrypto.so 拷到當前java目錄,當前目錄一共要有3個東西
4、最后,編譯GmSSL.java 并運行
mkdir -p org/gmssl
cp GmSSL.java org/gmssl
javac org/gmssl/GmSSL.java
java -Djava.library.path=/home/java/GmSSL/java -classpath /home/java/GmSSL/java org.gmssl.GmSSL
現在說下我是怎么發現這個坑的,一開始好不容易編譯通過了,直接運行,報錯
看著就像方法名不對,按master的最新GmSSL.java源碼,和官網過期GmSSL Wrapper示例源碼都不對,苦尋無果,只好把libgmssljni.so 用IDA-Pro反編譯了一下,看到寫死的類路徑的時候,一度想要砸鍵盤
總結
以上是生活随笔為你收集整理的gmssl java_GMSSL编译运行Java Wrapper踩坑记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot----整合Spr
- 下一篇: shell 脚本实现退点输出