Netty tcnative boringssl windows 32-bit 編譯

何德海發表於2021-01-05

1 問題

  在使用Netty SSL時,我們往往會採用netty-tcnative-boringssl元件。但是netty-tcnative-boringssl在Windows上僅有64位版本的,沒有32版本的。由於專案需要用於32位的,所以自己編譯了一下。

  下面詳細記錄編譯的步驟。

2 環境

  • VS2017 社群版。
  • Win10 SDK 10.0.17763.0
  • Java 8 201 32位
  • netty-tcnative-parent 2.0.34

 

3 步驟

3.1 下載原始碼

  • 使用2.0.34版本,這是近期的穩定版本。下載地址:
https://codeload.github.com/netty/netty-tcnative/zip/netty-tcnative-parent-2.0.34.Final
  • 解壓,並進入netty-tcnative-parent-2.0.34.Final目錄。

 

3.2 JAVA_HOME

   將環境變數 JAVA_HOME 指向 Java 8 32 位目錄。

 

3.3 修改pom.xml

位置:./pom.xml

 

註釋掉不要的模組,編譯速度會快很多,如下:

<modules>

    <module>boringssl-static</module>

    <!-- <module>openssl-dynamic</module>

    <module>openssl-static</module>

    <module>libressl-static</module> -->

</modules>


<archBits>64</archBits>

修改為:

<archBits>32</archBits>

  這個配置會影響APR元件的平臺版本。

 

 

<property name="tcnativeManifest" value="META-INF/native/${tcnative.snippet};processor=${os.detected.arch}" />-

修改為:

<condition property="osgi.processor" value="x86" else="${os.detected.arch}">
    <equals arg1="${os.detected.arch}" arg2="x86_32"/>
</condition>
<property name="tcnativeManifest" value="META-INF/native/${tcnative.snippet};processor=${osgi.processor}"/>

  這個修改的目的是生成適合OSGi環境使用的Bundle-NativeCode配置。不做這個修改的話,在OSGi環境下dll檔案檔案會找不到。

 

3.4 修改vs2010模板

位置:./vs2010.vcxproj.static.template

 

<PropertyGroup Label="Globals">

    <ProjectName>netty_tcnative</ProjectName>

    <RootNamespace>netty_tcnative</RootNamespace>

    <ProjectGuid>{42EB387C-0D16-471E-8859-C2CF31F8094D}</ProjectGuid>

</PropertyGroup>

修改為:

<PropertyGroup Label="Globals">

   <ProjectName>netty_tcnative</ProjectName>

    <RootNamespace>netty_tcnative</RootNamespace>

    <ProjectGuid>{42EB387C-0D16-471E-8859-C2CF31F8094D}</ProjectGuid>

    <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>

</PropertyGroup>

 

 

<PlatformToolset>v140</PlatformToolset>

修改為:

<PlatformToolset>v141</PlatformToolset>

 

  這兩項修改是讓vs2010.vcxproj專案跟編譯環境相匹配。

 

3.5 修改c檔案

位置:./openssl-dynamic/src/main/c/jnilib.c

 

#ifndef TCN_BUILD_STATIC

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {

return JNI_OnLoad_netty_tcnative0(vm, reserved);

}

JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved) {

JNI_OnUnload_netty_tcnative0(vm, reserved);

}

修改為:

#ifndef TCN_BUILD_STATIC
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
return JNI_OnLoad_netty_tcnative0(vm, reserved);
}
JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved) {
JNI_OnUnload_netty_tcnative0(vm, reserved);
}

  不做這個修改的話,會報連結錯誤。

 

3.6 下載 boringssl原始碼

git clone https://boringssl.googlesource.com/boringssl

  由於程式碼來自googlesource,所以需要科*上網。將boringssl的原始碼放到./boringssl-static/target目錄下。

 

3.7 執行

# 進入到32位編譯環境

call "D:\Program1\vs\2017-community\VC\Auxiliary\Build\vcvars32.bat"

# 打包

mvn package –X

 

4 小結

  編譯過程中由於環境的不同,可能會出現各種問題。遇到問題時,耐心一些,參考錯誤日誌,一個一個地解決就可以了。

 

5 參考資料

 

6 附件

  為方便大家使用,本文附帶了一個編譯好的檔案。如下:

 

相關文章