如果你没有AOSP源代码,你可以从http://www.openssl.org/source/下载OpenSSL源代码。使用最新的OpenSSL版本可以避免任何已知的旧版本缺陷。AOSP集成了OpenSSL库,可以直接将它放到应用程序的jni目录来访问已包含的目录。
如果你正在下载OpenSSL源代码,并打算通过交叉编译来创建库,请按照下面的步骤进行:
-
下载源代码:
wget https://www.openssl.org/source/openssl-1.0.1j.tar.gz -
编译 ‒ 在控制台运行下面的命令(注意,你需要设置NDK变量到系统的完整路径)
export NDK=~/android-ndk-r9d
export TOOL=arm-linux-androideabi
export NDK_TOOLCHAIN_BASENAME=${TOOLCHAIN_PATH}/${TOOL}
export CC=$NDK_TOOLCHAIN_BASE-gcc
export CXX=$NDK_TOOLCHAIN_BASENAME-g++
export LINK=${CXX}
export LD=$NDK_TOOLCHAIN_BASENAME-ld
export AR=$NDK_TOOLCHAIN_BASENAME-ar
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, --flx-cortex-a"
export CPPFLAGS=
"${ARCH_FLAGS} –fpic –ffunction-sections –funwind-tables –fstack-protector –fno-strict-aliasing –finline-limited=64"
export LDFLAGS=
"${ARCH_LINK"
}
export CXXFLAGS=
"${ ARCH_FLAGS} –fpic –ffunction-sections –funwind-tables –fstack-protector –fno-strict-aliasing –finline-limited=64 –frtti –fexceptions"
cd $OPENSSL_SRC_PATH
export CC=
"$STANDALONE_TOOCHAIN_PATH/bin/i686-linux-android-gcc –mtune=atome –march=atom –sysroot=$STANDALONE_TOOCHAIN_PATH/sysroot"
export AR=$STANDALONE_TOOCHAIN_PATH/bin/i686-linux-android-ar
export RANLIB=$STANDALONE_TOOCHAIN_PATH/bin/i686-linux-android-ranlib
./Configure android-x86 –DOPENSSL_IA32_SSE2 –DAES_ASM –DVPAES_ASM
make
接下来你可以在最上层的目录得到 libcrypto.a 。如果你想要使用 *.so 文件,输入 “Configure shared android-x86 ***”。
如果你有AOSP源代码,你无需ndk工具链,
source build/envsetiup.sh
lunch <options>
make –j8
cd external/openssl
mm
这创建了 libcrypto.a,并放到目录 out/host/linux_x86/bin
通过NDK在Android项目中使用OpenSSL
-
创建一个 android项目,在你最喜欢的IDE中加密文件 -- 这个例子基于 Eclipse。
-
通过Android.mk将OpenSSL相关的函数声明为 native 函数 。
-
在Android项目源代码下创建一个jni目录。
-
将之前编译的文件,include目录放置到jni目录下。
-
包含在jni目录下创建的OpenSSL库目录<OpenSSL source/include/>。
-
接下来在 jni/*.c 中编写C函数来实现加密。完成之后,你需要拷贝 *.a/*.so 以及头文件到项目之中。
-
在步骤1中创建的作为系统库的Android类函数中加载jni目录下的库和C实现。
下面的部分,描述了如何在应用程序中引用OpenSSL库,以及如何在Java类中调用它。
在Eclipse中新建一个工程,例如 EncryptFileOpenSSL 。使用Eclipse (在Project Explorer上右击工程名,或者使用终端创建 jni目录,以及两个子目录--pre-compiled 以及 include。
使用终端:
cd <workspace/of/Project>
mkdir jni/pre-compiled/
mkdir jni/include
cp $OPENSSL_PATH/libcrypto.a jni/pre-compiled
cp –L -rf $OPENSSL_PATH/include/openssl jni/include