UE4でgRPCを使うことになり調べた結果以下のプラグインを見つけWindowsでの稼働は確認できました。
次にAndroidでの稼働を確認するため下記のDockerfileを作成
Linux環境でgRPCC++をビルドし*.aファイルを作成しました。
FROM debian:stretch
RUN apt-get update && apt-get install -y \
build-essential autoconf libtool git pkg-config curl \
automake libtool curl make g++ unzip cmake wget tar sudo libssl-dev clang libc++-dev \
&& apt-get clean
# jdk install
RUN apt-get install -y openjdk-8-jre
RUN mkdir /usr/local/android
WORKDIR /usr/local/android
RUN wget https://dl.google.com/android/repository/android-ndk-r21b-linux-x86_64.zip
RUN unzip android-ndk-r21b-linux-x86_64.zip
# install grpc
ENV GRPC_RELEASE_TAG v1.32.x
RUN git clone -b ${GRPC_RELEASE_TAG} https://github.com/grpc/grpc /var/local/git/grpc
WORKDIR /var/local/git/grpc
RUN ls -la
RUN git fetch
RUN git submodule update --init
# install ue4
RUN mkdir /usr/ue4
RUN git clone -b 4.25 https://dwe-tanaka:tanaka4856@github.com/EpicGames/UnrealEngine.git /usr/ue4
RUN cd /usr/ue4 && ./Setup.sh
RUN mkdir /usr/build
WORKDIR /usr/build
RUN cmake /var/local/git/grpc \
-DCMAKE_TOOLCHAIN_FILE=/usr/local/android/android-ndk-r21b/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=android-26 \
-DANDROID_STL=c++_static \
-DRUN_HAVE_STD_REGEX=0 \
-DRUN_HAVE_POSIX_REGEX=0 \
-DRUN_HAVE_STEADY_CLOCK=0 \
-Dprotobuf_BUILD_TESTS=OFF \
-DgRPC_RE2_PROVIDER=module \
-DgRPC_ZLIB_PROVIDER=package \
-DZLIB_INCLUDE_DIRS=/usr/ue4/Engine/Source/ThirdParty/zlib/v1.2.8/include/Linux/aarch64-unknown-linux-gnueabi \
-DZLIB_LIBRARIES=/usr/ue4/Engine/Source/ThirdParty/zlib/v1.2.8/lib/Linux/aarch64-unknown-linux-gnueabi/libz.a \
-DgRPC_SSL_PROVIDER=package \
-DOPENSSL_VERSION=1.1.1c \
-DOPENSSL_ROOT_DIR=/usr/ue4/Engine/Source/ThirdParty/OpenSSL \
-DOPENSSL_INCLUDE_DIR=/usr/ue4/Engine/Source/ThirdParty/OpenSSL/1.1.1c/include/Linux/aarch64-unknown-linux-gnueabi \
-DOPENSSL_SSL_LIBRARY=/usr/ue4/Engine/Source/ThirdParty/OpenSSL/1.1.1c/lib/Linux/aarch64-unknown-linux-gnueabi/libssl.a \
-DOPENSSL_CRYPTO_LIBRARY=/usr/ue4/Engine/Source/ThirdParty/OpenSSL/1.1.1c/lib/Linux/aarch64-unknown-linux-gnueabi/libcrypto.a \
-DCMAKE_BUILD_TYPE=Release
RUN cmake --build . --target grpc++
※UE4のソースコードのDLとビルドを行っているのでこのまま実行するとめちゃくちゃ時間かかるし容量を食うので注意
生成された*.aファイルをプロジェクトに追加してAndroid (マルチ:ASTC,DXT,ETC2)でパッケージ化を実行したところ以下のエラーで止まりました。
ld.lld: error: undefined symbol: EVP_MD_CTX_new
ld.lld: error: undefined symbol: EVP_MD_CTX_free
.....
調べたところ、*.aをビルドした環境とUE4のopensslのバージョンが食い違っていることで発生しているとわかりました。
UE4のドキュメントに書いてある通りopensslは1.1.1cを使用したのですが、UE4のopensslのビルド設定を見るとAndroidのみ1.0.1が使われるようになっていました。
>Epic Games\UE_4.25\Engine\Source\ThirdParty\OpenSSL\OpenSSL.Build.cs
else if (Target.Platform == UnrealTargetPlatform.Android || Target.Platform == UnrealTargetPlatform.Lumin)
{
string IncludePath = OpenSSL101sPath + "/include/Android";
PublicIncludePaths.Add(IncludePath);
// unneeded since included in libcurl
// string LibPath = Path.Combine(OpenSSL101sPath, "lib", PlatformSubdir);
//PublicLibraryPaths.Add(LibPath);
}
これを解消するにはAndroidのみopensslのバージョンを1.0.1にしないといけないのでしょうか
プラットフォームによってバージョンが違うとなると挙動が不安定になりそうで怖いです。
こちらAndroidも1.1.1cを使えるようにする方法など何かないでしょうか。
環境
Windows10_64bit
UnrealEngine4.25
Docker for windows c1.19.3