• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            在 Cocos2d-x 中使用 OpenSSL

            轉(zhuǎn)載自:http://leenjewel.github.io/blog/2015/06/30/zai-cocos2d-x-zhong-shi-yong-openssl/

            在我們使用 Cocos2d-x 引擎制作游戲過程中經(jīng)常會(huì)遇到諸如對(duì)數(shù)據(jù)進(jìn)行加密、解密、MD5、SHA1 散列計(jì)算等操作的需求。對(duì)于這樣的需求使用 OpenSSL 庫來解決是最為方便的。下面我們就說說如何將 OpenSSL 庫集成到 Cocos2d-x 項(xiàng)目中并在 iOS 和 Android 平臺(tái)下使用。什么?!不知道 OpenSSL 是什么?這么大名鼎鼎的開源項(xiàng)目,移步 Wiki 去了解吧。

            下載 OpenSSL 源代碼

            直接到 OpenSSL 開源項(xiàng)目官網(wǎng)去下載最新版本即可。我下載的是openssl-1.0.2c

            編譯生成 iOS 平臺(tái)下適用的 OpenSSL 靜態(tài)鏈接庫

            首先解壓縮你下載的 OpenSSL 源代碼壓縮包。

            tar -zxvf openssl-1.0.2c.tar.gz

            玩過 Linux 的人都知道從源代碼編譯程序一般需要三步:

            1. ./Configure
            2. make
            3. make install

            編譯 OpenSSL 生成靜態(tài)鏈接庫的過程也一樣,唯一的區(qū)別是我們要針對(duì)不同的平臺(tái)架構(gòu)生成針對(duì)每個(gè)平臺(tái)架構(gòu)的靜態(tài)鏈接庫。例如 iPhone、iPad 目前有三種架構(gòu):arm64armv7sarmv7外加模擬器的架構(gòu) i386,所以我們要重復(fù)上面三個(gè)步驟 4 次,生成四個(gè)平臺(tái)架構(gòu)對(duì)應(yīng)的靜態(tài)鏈接庫。

            這里我們偷個(gè)懶,用 GitHub 上 Raphaelios 寫的 Shell 腳本來直接編譯 OpenSSL ,下面我貼出腳本的源碼并簡單添加一些說明注釋。

            #!/bin/bash
            #
            #  Copyright (c) 2013 Claudiu-Vlad Ursache <claudiu@cvursache.com>
            #  MIT License (see LICENSE.md file)
            #
            #  Based on work by Felix Schulze:
            #
            #  Automatic build script for libssl and libcrypto 
            #  for iPhoneOS and iPhoneSimulator
            #
            #  Created by Felix Schulze on 16.12.10.
            #  Copyright 2010 Felix Schulze. All rights reserved.
            #
            #  Licensed under the Apache License, Version 2.0 (the "License");
            #  you may not use this file except in compliance with the License.
            #  You may obtain a copy of the License at
            #
            #  http://www.apache.org/licenses/LICENSE-2.0
            #
            #  Unless required by applicable law or agreed to in writing, software
            #  distributed under the License is distributed on an "AS IS" BASIS,
            #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
            #  See the License for the specific language governing permissions and
            #  limitations under the License.

            # 當(dāng)執(zhí)行時(shí)使用到未定義過的變量,則顯示錯(cuò)誤信息

            set -u

            # Setup architectures, library name and other vars + cleanup from previous runs

            # 四個(gè)平臺(tái)架構(gòu)標(biāo)識(shí)

            ARCHS=("arm64" "armv7s" "armv7" "i386")

            # 四個(gè)平臺(tái)架構(gòu)分別對(duì)應(yīng)的 SDK 名稱
            SDKS=("iphoneos" "iphoneos" "iphoneos" "macosx")

            # 使用的 OpenSSL 庫版本
            LIB_NAME="openssl-1.0.2c"

            # 臨時(shí)輸出目錄
            TEMP_LIB_PATH="/tmp/${LIB_NAME}"
            LIB_DEST_DIR="lib"
            HEADER_DEST_DIR="include"
            rm -rf "${HEADER_DEST_DIR}" "${LIB_DEST_DIR}" "${TEMP_LIB_PATH}*" "${LIB_NAME}"

            # Unarchive library, then configure and make for specified architectures
            # 編譯靜態(tài)鏈接庫的函數(shù)

            configure_make()
            {
               ARCH=$1; GCC=$2; SDK_PATH=$3;
               LOG_FILE="${TEMP_LIB_PATH}-${ARCH}.log"
               tar xfz "${LIB_NAME}.tar.gz"
               pushd .; cd "${LIB_NAME}";

               ./Configure BSD-generic32 --openssldir="${TEMP_LIB_PATH}-${ARCH}" &> "${LOG_FILE}"

               make CC="${GCC} -arch ${ARCH}" CFLAG="-isysroot ${SDK_PATH}" &> "${LOG_FILE}";
               make install &> "${LOG_FILE}";
               popd; rm -rf "${LIB_NAME}";
            }

            # 分別開始編譯四個(gè)平臺(tái)架構(gòu)的靜態(tài)鏈接庫
            for ((i=0; i < ${#ARCHS[@]}; i++))
            do
               # 獲取 SDK 路徑
               SDK_PATH=$(xcrun -sdk ${SDKS[i]} --show-sdk-path)
               # 過去 gcc 編譯器路徑
               GCC=$(xcrun -sdk ${SDKS[i]} -find gcc)
               # 編譯
               configure_make "${ARCHS[i]}" "${GCC}" "${SDK_PATH}"
            done

            # Combine libraries for different architectures into one
            # Use .a files from the temp directory by providing relative paths
            # 通過 lipo 命令將四個(gè)平臺(tái)架構(gòu)的靜態(tài)庫打包成一個(gè)靜態(tài)庫

            create_lib()
            {
               LIB_SRC=$1; LIB_DST=$2;
               LIB_PATHS=( "${ARCHS[@]/#/${TEMP_LIB_PATH}-}" )
               LIB_PATHS=( "${LIB_PATHS[@]/%//${LIB_SRC}}" )
               lipo ${LIB_PATHS[@]} -create -output "${LIB_DST}"
            }
            mkdir "${LIB_DEST_DIR}";
            create_lib "lib/libcrypto.a" "${LIB_DEST_DIR}/libcrypto.a"
            create_lib "lib/libssl.a" "${LIB_DEST_DIR}/libssl.a"

            # Copy header files + final cleanups
            mkdir -p "${HEADER_DEST_DIR}"
            cp -R "${TEMP_LIB_PATH}-${ARCHS[0]}/include" "${HEADER_DEST_DIR}"
            rm -rf "${TEMP_LIB_PATH}-*" "{LIB_NAME}"

            這個(gè)腳本的用法就是將腳本和剛剛下載的 OpenSSL 源碼壓縮包放在同一個(gè)目錄下,然后不用解壓 OpenSSL 壓縮包,直接運(yùn)行腳本即可。

            sh  build-openssl.sh

            耐心等待片刻之后,如果沒有任何報(bào)錯(cuò)信息,則會(huì)在腳本所在目錄多出兩個(gè)目錄 include 和 lib,在 lib 目錄下就是我們剛剛通過腳本生成好的靜態(tài)鏈接庫 libcrypto.a 和 libssl.a

            編譯生成 Android 平臺(tái)下適用的 OpenSSL 靜態(tài)鏈接庫

            接下來我們繼續(xù)編譯 Android 平臺(tái)下的 OpenSSL 靜態(tài)鏈接庫。編譯 Android 下的靜態(tài)鏈接庫自然要用到 NDK。所以首先要確保你下載了 NDK。我這里使用的是 android-ndk-r10d

            同樣根據(jù)平臺(tái)架構(gòu)不同 Android 下面可以生成 armarmv7x86。具體的生成步驟都是直接在命令行下執(zhí)行的。

            首先解壓縮你的 OpenSSL 源代碼壓縮包并跳轉(zhuǎn)至解壓縮后的源代碼目錄.

            tar -zxvf openssl-1.0.2c.tar.gz
            cd openssl-1.0.2c

            armv7a
            #設(shè)置你自己的 NDK 路徑
            export NDK=/Your Android NDK Path/android-ndk-r10d
            $NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --toolchain=arm-linux-androideabi-4.6 --install-dir=`pwd`/android-toolchain-arm
            export TOOLCHAIN_PATH=`pwd`/android-toolchain-arm/bin
            export TOOL=arm-linux-androideabi
            export NDK_TOOLCHAIN_BASENAME=${TOOLCHAIN_PATH}/${TOOL}
            export CC=$NDK_TOOLCHAIN_BASENAME-gcc
            export CXX=$NDK_TOOLCHAIN_BASENAME-g++
            export LINK=${CXX}
            export LD=$NDK_TOOLCHAIN_BASENAME-ld
            export AR=$NDK_TOOLCHAIN_BASENAME-ar
            export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
            export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
            export ARCH_FLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"
            export ARCH_LINK="-march=armv7-a -Wl,--fix-cortex-a8"
            export CPPFLAGS=" ${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
            export CXXFLAGS=" ${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
            export CFLAGS=" ${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
            export LDFLAGS=" ${ARCH_LINK} "
            ./Configure android-armv7
            PATH=$TOOLCHAIN_PATH:$PATH make
            上述命令運(yùn)行完成后,同樣你會(huì)在 OpenSSL 源代碼目錄發(fā)現(xiàn)新生成的兩個(gè)靜態(tài)鏈接庫文件libcrypto.a 和 libssl.a。我們新建一個(gè)目錄 armeabi-v7a 將兩個(gè)新生成的靜態(tài)鏈接庫文件移動(dòng)到這個(gè)文件夾中備用。

            然后我們刪除掉剛剛解壓縮的 OpenSSL 源碼目錄,重新解壓縮 OpenSSL 的源代碼壓縮包,準(zhǔn)備繼續(xù)編譯生成另外平臺(tái)架構(gòu)的靜態(tài)鏈接庫。

            arm
            #設(shè)置你自己的 NDK 路徑
            export NDK=/Your Android NDK Path/android-ndk-r10d
            $NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --toolchain=arm-linux-androideabi-4.6 --install-dir=`pwd`/android-toolchain-arm
            export TOOLCHAIN_PATH=`pwd`/android-toolchain-arm/bin
            export TOOL=arm-linux-androideabi
            export NDK_TOOLCHAIN_BASENAME=${TOOLCHAIN_PATH}/${TOOL}
            export CC=$NDK_TOOLCHAIN_BASENAME-gcc
            export CXX=$NDK_TOOLCHAIN_BASENAME-g++
            export LINK=${CXX}
            export LD=$NDK_TOOLCHAIN_BASENAME-ld
            export AR=$NDK_TOOLCHAIN_BASENAME-ar
            export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
            export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
            export ARCH_FLAGS="-mthumb"
            export ARCH_LINK=
            export CPPFLAGS=" ${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
            export CXXFLAGS=" ${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
            export CFLAGS=" ${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
            export LDFLAGS=" ${ARCH_LINK} "
            ./Configure android
            PATH=$TOOLCHAIN_PATH:$PATH make
            然后我們新建一個(gè)目錄 armeabi 將新生成的靜態(tài)鏈接庫文件 libcrypto.a 和 libssl.a 移動(dòng)到這個(gè)文件夾中備用。刪除掉源代碼目錄,重新解壓,繼續(xù)編譯生成靜態(tài)鏈接庫。

            x86
            #設(shè)置你自己的 NDK 路徑
            export NDK=/Your Android NDK Path/android-ndk-r10d
            $NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --toolchain=x86-4.6 --install-dir=`pwd`/android-toolchain-x86
            export TOOLCHAIN_PATH=`pwd`/android-toolchain-x86/bin
            export TOOL=i686-linux-android
            export NDK_TOOLCHAIN_BASENAME=${TOOLCHAIN_PATH}/${TOOL}
            export CC=$NDK_TOOLCHAIN_BASENAME-gcc
            export CXX=$NDK_TOOLCHAIN_BASENAME-g++
            export LINK=${CXX}
            export LD=$NDK_TOOLCHAIN_BASENAME-ld
            export AR=$NDK_TOOLCHAIN_BASENAME-ar
            export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
            export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
            export ARCH_FLAGS="-march=i686 -msse3 -mstackrealign -mfpmath=sse"
            export ARCH_LINK=
            export CPPFLAGS=" ${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
            export CXXFLAGS=" ${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
            export CFLAGS=" ${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
            export LDFLAGS=" ${ARCH_LINK} "
            ./Configure android-x86
            PATH=$TOOLCHAIN_PATH:$PATH make
            同樣我們新建一個(gè)目錄 x86 用來存放新生成的靜態(tài)鏈接庫文件 libcrypto.a 和 libssl.a

            將 OpenSSL 接入 Cocos2d-x 項(xiàng)目

            iOS 和 Android 適用的 OpenSSL 靜態(tài)鏈接庫我們都已經(jīng)編譯生成了。下面看看我們?cè)趺磳?OpenSSL 靜態(tài)鏈接庫接入到 Cocos2d-x 項(xiàng)目中來使用。

            引入 iOS 適用的 OpenSSL 靜態(tài)鏈接庫

            首先這里要說明的是我使用的 Cocos2d-x 版本是 3.6。我們先在 Cocos2d-x 項(xiàng)目中新建一個(gè)文件夾。

            mkdir -p Your_Cocos2d-x_Project_Path/Classes/security/openssl

            然后我們將 iOS 適用的 OpenSSL 靜態(tài)鏈接庫文件 libcrypto.a 和 libssl.a 拷貝到我們剛剛新建的目錄下。

            在 Xcode 中將 OpenSSL 的靜態(tài)鏈接庫文件libcrypto.a 和 libssl.a 引入到項(xiàng)目中。具體做法就是在 [Build Phases] ====> [Link Binary With Libraries] 中添加對(duì)兩個(gè)靜態(tài)鏈接庫的引用。

            在 Xcode 中添加 OpenSSL 頭文件搜索路徑

            然后我們?cè)傩陆ㄒ粋€(gè)用于存放 OpenSSL 頭文件的文件夾

            mkdir -p Your_Cocos2d-x_Project_Path/Classes/security/openssl/include/openssl

            將我們剛剛生成 iOS 適用的 OpenSSL 靜態(tài)鏈接庫文件時(shí)生成的 include 文件夾下面找到的所有的 .h 頭文件全部復(fù)制到我們剛剛生成的目錄下面。

            這里需要特別注意的是包含 OpenSSL 頭文件的文件夾必須叫作 openssl ,否則項(xiàng)目編譯會(huì)不成功。

            然后繼續(xù)在 Xcode 中設(shè)置 OpenSSL 頭文件的搜索路徑。具體做法就是在 [Build Settings] ====> [User Header Search Paths] 中添加剛剛我們建立的用于存放 OpenSSL 頭文件的目錄的路徑。要添加的路徑為 Your_Cocos2d-x_Project_Path/Classes/security/openssl/include

            引入 Android 適用的 OpenSSL 靜態(tài)鏈接庫

            我們把剛剛用于存放 OpenSSL 靜態(tài)鏈接庫文件的 armeabi 文件夾拷貝到 Cocos2d-x 項(xiàng)目中來,拷貝的位置是 Android 用于存放庫文件的 libs 文件夾。

            cp -ivr Your_OpenSSL_Android_Path/armeabi  \
              Your_Cocos2d-x_Project_Path/proj.android/libs/

            這里需要特別注意如果你的 Cocos2d-x 項(xiàng)目原本已經(jīng)有了 armeabi 文件夾,注意不要覆蓋,而是將 libcrypto.a 和libssl.a 文件直接放入已有的 armeabi 文件夾中即可。

            在 Android.mk 文件中添加 OpenSSL 頭文件搜索路徑

            用趁手的編輯器打開 Your_Cocos2d-x_Project_Path/proj.android/jni/Android.mk 文件,將 OpenSSL 頭文件路徑添加到 LOCAL_C_INCLUDES 變量中。

            LOCAL_C_INCLUDES := \
              #  Some Other Paths \
              $(LOCAL_PATH)/../../Classes/security/openssl/include \
              #  Some Other Paths \

            走個(gè)捷徑

            如果你覺得編譯太麻煩,要編譯的東西太多太復(fù)雜,或者手頭沒有編譯環(huán)境,翻.墻下載個(gè) NDK 又太費(fèi)勁巴拉巴拉……總之你不想自己編譯 OpenSSL 的靜態(tài)鏈接庫,那么你可以走一個(gè)捷徑。直接使用我已經(jīng)編譯好的文件即可。我已經(jīng)把編譯好的 OpenSSL 靜態(tài)鏈接庫放在 GitHub 上方便大家自取了

            git clone git@github.com:leenjewel/openssl_for_ios_and_android.git


            參考資料

            如果你的 Cocos2d-x 項(xiàng)目編譯運(yùn)行成功,那么恭喜你,OpenSSL 庫已經(jīng)接入到你得項(xiàng)目中了,你已經(jīng)可以調(diào)用 OpenSSL 的 API 來實(shí)現(xiàn)你自己的需求了。這里附上兩個(gè)相關(guān)的資料供你參考:

            《How-To-Build-openssl-For-iOS》

            《Compiling the latest OpenSSL for Android》

            posted on 2016-12-29 11:04 楊粼波 閱讀(1537) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久精品视频网| 亚洲欧美日韩精品久久亚洲区| 久久婷婷午色综合夜啪| 中文字幕亚洲综合久久2| 亚洲国产精品久久久久| 69久久精品无码一区二区| 激情伊人五月天久久综合 | 久久人人爽人人爽人人AV| 久久国语露脸国产精品电影| 久久久久久国产a免费观看黄色大片| 中文字幕无码久久久| 婷婷久久五月天| 久久婷婷五月综合国产尤物app| 亚洲国产精品无码成人片久久 | 亚洲精品国产美女久久久| 无码伊人66久久大杳蕉网站谷歌 | 青青草国产精品久久| 国产成人精品久久一区二区三区av| 91精品国产91久久久久久| 久久天天躁狠狠躁夜夜2020| 日日狠狠久久偷偷色综合免费| 久久久这里只有精品加勒比| 色综合久久综合中文综合网| 国产成人久久精品区一区二区| 国产亚州精品女人久久久久久 | 久久精品人妻中文系列| 99久久久精品免费观看国产| 亚洲&#228;v永久无码精品天堂久久 | 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 波多野结衣久久一区二区| 久久亚洲日韩精品一区二区三区| 国产精品久久波多野结衣| 一极黄色视频久久网站| 77777亚洲午夜久久多喷| 亚洲乱码日产精品a级毛片久久| 国产精品美女久久久久久2018| 久久精品二区| 2021精品国产综合久久| 国产精品久久久久久久人人看 | 亚洲国产精品无码久久久久久曰 | 青青草国产精品久久久久|