青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

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

在 Cocos2d-x 中使用 OpenSSL

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

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

下載 OpenSSL 源代碼

直接到 OpenSSL 開源項目官網去下載最新版本即可。我下載的是openssl-1.0.2c

編譯生成 iOS 平臺下適用的 OpenSSL 靜態鏈接庫

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

tar -zxvf openssl-1.0.2c.tar.gz

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

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

編譯 OpenSSL 生成靜態鏈接庫的過程也一樣,唯一的區別是我們要針對不同的平臺架構生成針對每個平臺架構的靜態鏈接庫。例如 iPhone、iPad 目前有三種架構:arm64、armv7sarmv7外加模擬器的架構 i386,所以我們要重復上面三個步驟 4 次,生成四個平臺架構對應的靜態鏈接庫。

這里我們偷個懶,用 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.

# 當執行時使用到未定義過的變量,則顯示錯誤信息

set -u

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

# 四個平臺架構標識

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

# 四個平臺架構分別對應的 SDK 名稱
SDKS=("iphoneos" "iphoneos" "iphoneos" "macosx")

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

# 臨時輸出目錄
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
# 編譯靜態鏈接庫的函數

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}";
}

# 分別開始編譯四個平臺架構的靜態鏈接庫
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 命令將四個平臺架構的靜態庫打包成一個靜態庫

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}"

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

sh  build-openssl.sh

耐心等待片刻之后,如果沒有任何報錯信息,則會在腳本所在目錄多出兩個目錄 include 和 lib,在 lib 目錄下就是我們剛剛通過腳本生成好的靜態鏈接庫 libcrypto.a 和 libssl.a。

編譯生成 Android 平臺下適用的 OpenSSL 靜態鏈接庫

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

同樣根據平臺架構不同 Android 下面可以生成 arm、armv7x86。具體的生成步驟都是直接在命令行下執行的。

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

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

armv7a
#設置你自己的 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
上述命令運行完成后,同樣你會在 OpenSSL 源代碼目錄發現新生成的兩個靜態鏈接庫文件libcrypto.a 和 libssl.a。我們新建一個目錄 armeabi-v7a 將兩個新生成的靜態鏈接庫文件移動到這個文件夾中備用。

然后我們刪除掉剛剛解壓縮的 OpenSSL 源碼目錄,重新解壓縮 OpenSSL 的源代碼壓縮包,準備繼續編譯生成另外平臺架構的靜態鏈接庫。

arm
#設置你自己的 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
然后我們新建一個目錄 armeabi 將新生成的靜態鏈接庫文件 libcrypto.a 和 libssl.a 移動到這個文件夾中備用。刪除掉源代碼目錄,重新解壓,繼續編譯生成靜態鏈接庫。

x86
#設置你自己的 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
同樣我們新建一個目錄 x86 用來存放新生成的靜態鏈接庫文件 libcrypto.a 和 libssl.a。

將 OpenSSL 接入 Cocos2d-x 項目

iOS 和 Android 適用的 OpenSSL 靜態鏈接庫我們都已經編譯生成了。下面看看我們怎么將 OpenSSL 靜態鏈接庫接入到 Cocos2d-x 項目中來使用。

引入 iOS 適用的 OpenSSL 靜態鏈接庫

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

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

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

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

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

然后我們再新建一個用于存放 OpenSSL 頭文件的文件夾

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

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

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

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

引入 Android 適用的 OpenSSL 靜態鏈接庫

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

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

這里需要特別注意如果你的 Cocos2d-x 項目原本已經有了 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 \

走個捷徑

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

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


參考資料

如果你的 Cocos2d-x 項目編譯運行成功,那么恭喜你,OpenSSL 庫已經接入到你得項目中了,你已經可以調用 OpenSSL 的 API 來實現你自己的需求了。這里附上兩個相關的資料供你參考:

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

《Compiling the latest OpenSSL for Android》

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            香蕉久久久久久久av网站 | 亚洲电影免费观看高清完整版在线| 欧美成人按摩| 久久久国产成人精品| 欧美日韩在线视频一区| 亚洲高清视频的网址| 国产亚洲午夜高清国产拍精品| 亚洲精品欧美激情| 亚洲区一区二区三区| 欧美一级视频精品观看| 欧美亚洲系列| 国产精品区二区三区日本| 亚洲精选视频免费看| 亚洲精品系列| 欧美高清视频www夜色资源网| 久久综合狠狠综合久久综青草 | 亚洲女人小视频在线观看| 欧美高清视频www夜色资源网| 欧美 日韩 国产一区二区在线视频 | 欧美一区=区| 国产精品福利影院| 亚洲视频中文| 亚洲午夜国产成人av电影男同| 欧美激情一区二区三区在线| 亚洲国产精品成人一区二区| 亚洲国产小视频在线观看| 麻豆国产va免费精品高清在线| 免费日韩视频| 亚洲高清在线观看| 免费成人小视频| 亚洲福利小视频| 亚洲国产欧美另类丝袜| 美国成人毛片| 亚洲国产欧美日韩| 一区二区三区产品免费精品久久75 | 欧美性猛片xxxx免费看久爱| 99re视频这里只有精品| 亚洲一区区二区| 国产精品国产福利国产秒拍| 亚洲视频一区二区| 久久精品日产第一区二区| 极品少妇一区二区三区精品视频 | 午夜精品久久99蜜桃的功能介绍| 欧美一区精品| 在线观看欧美黄色| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲伦理在线| 欧美一区二区三区视频| 国外精品视频| 欧美大片一区二区三区| 夜夜爽av福利精品导航| 欧美综合激情网| 亚洲第一网站| 欧美日韩专区在线| 久久爱www.| 亚洲激情在线激情| 欧美专区在线| 日韩一级欧洲| 国产日韩一区欧美| 欧美va天堂| 亚洲一区二区三区色| 欧美成人黄色小视频| 亚洲视频在线二区| 在线成人亚洲| 国产精品成人av性教育| 久久久久九九视频| 一本久久a久久免费精品不卡| 久久精品女人| 亚洲永久免费| 91久久黄色| 国产午夜亚洲精品羞羞网站| 欧美风情在线| 久久久久成人精品| 亚洲一区二区视频| 亚洲精品视频在线看| 久久久久欧美精品| 午夜精品久久久久久久久久久| 亚洲第一中文字幕| 国产欧美精品日韩| 欧美日韩精品| 欧美成年视频| 久久精品国产99| 亚洲综合色网站| 99精品视频免费| 亚洲国产日韩综合一区| 久久久亚洲综合| 亚洲专区在线| 亚洲在线一区二区三区| 亚洲精品视频在线观看免费| 在线观看国产欧美| 国产亚洲精品aa午夜观看| 欧美视频免费在线| 欧美日本韩国一区二区三区| 久久噜噜噜精品国产亚洲综合| 亚洲欧美综合国产精品一区| 一本色道久久综合亚洲精品婷婷 | 亚洲欧洲日产国产综合网| 免费高清在线一区| 久久男人av资源网站| 久久精品成人一区二区三区蜜臀| 亚洲视频在线播放| 一区二区三区日韩精品视频| 亚洲裸体在线观看| 亚洲欧洲在线免费| 日韩视频―中文字幕| 91久久精品一区二区别| 亚洲精品视频二区| 夜夜精品视频一区二区| 99精品国产在热久久婷婷| 亚洲激情av| 亚洲精品日韩综合观看成人91| 一色屋精品视频在线看| 怡红院精品视频| 亚洲高清在线精品| 亚洲精品在线免费| 一区二区精品在线| 中文在线一区| 午夜精品一区二区三区电影天堂| 午夜精品久久久久久久久| 欧美一区深夜视频| 久久精品国产亚洲一区二区三区| 久久全球大尺度高清视频| 久久午夜精品| 亚洲国产激情| 亚洲作爱视频| 午夜视频久久久| 久久五月天婷婷| 欧美成人自拍| 国产精品ⅴa在线观看h| 国产日韩专区| 亚洲福利一区| 在线中文字幕不卡| 欧美一区二区三区免费大片| 玖玖玖国产精品| 亚洲黄色影片| 亚洲在线中文字幕| 久久九九免费| 欧美日韩另类视频| 国产一区亚洲| 一本色道88久久加勒比精品| 午夜在线电影亚洲一区| 久久在线免费观看视频| 最新日韩在线视频| 午夜电影亚洲| 欧美激情精品久久久六区热门| 国产精品日产欧美久久久久| 精久久久久久久久久久| 一卡二卡3卡四卡高清精品视频| 午夜精品亚洲一区二区三区嫩草| 久久最新视频| 国产精品99久久不卡二区| 久久野战av| 国产精品久久久久久久久久久久久久 | 久久精品99久久香蕉国产色戒| 美女视频黄 久久| 国产精品日韩欧美| 在线视频国内自拍亚洲视频| 亚洲一区二区三区四区视频| 欧美成人一区二区三区| 亚洲综合国产激情另类一区| 欧美大胆a视频| 国产有码一区二区| 亚洲午夜久久久久久久久电影网| 免费黄网站欧美| 亚洲欧美日本另类| 欧美了一区在线观看| 影音先锋中文字幕一区| 午夜在线视频一区二区区别| 亚洲人体大胆视频| 久久久噜噜噜久噜久久| 国产欧美精品在线观看| 亚洲性视频h| 亚洲国语精品自产拍在线观看| 久久疯狂做爰流白浆xx| 国产精品三级久久久久久电影| 亚洲巨乳在线| 欧美激情在线免费观看| 欧美在线3区| 国产欧美一区二区三区久久| 亚洲天堂黄色| 亚洲精品国产视频| 欧美高清视频| 亚洲精品乱码久久久久久蜜桃91 | 亚洲一区二区黄色| 欧美亚洲成人精品| 亚洲一区二区少妇| avtt综合网| 欧美日韩专区在线| 亚洲性人人天天夜夜摸| 一本大道久久a久久综合婷婷| 欧美美女bb生活片| 99视频+国产日韩欧美| 亚洲精品久久久久久一区二区 | 欧美国产一区二区三区激情无套| 精品91视频| 免费日韩精品中文字幕视频在线| 久久免费国产| 亚洲精品一二三区| 日韩午夜电影| 国产精品jizz在线观看美国 |