通过 JNI 调用 OpenSSL 实现加密解密

如果你没有AOSP源代码,你可以从http://www.openssl.org/source/下载OpenSSL源代码。使用最新的OpenSSL版本可以避免任何已知的旧版本缺陷。AOSP集成了OpenSSL库,可以直接将它放到应用程序的jni目录来访问已包含的目录。

如果你正在下载OpenSSL源代码,并打算通过交叉编译来创建库,请按照下面的步骤进行:

  1. 下载源代码:
    wget https://www.openssl.org/source/openssl-1.0.1j.tar.gz

  2. 编译 ‒ 在控制台运行下面的命令(注意,你需要设置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 &ndash;j8
 
       cd external/openssl
 
       mm

这创建了 libcrypto.a,并放到目录 out/host/linux_x86/bin

通过NDK在Android项目中使用OpenSSL

  1. 创建一个 android项目,在你最喜欢的IDE中加密文件 -- 这个例子基于 Eclipse。

  2. 通过Android.mk将OpenSSL相关的函数声明为 native 函数

  3. 在Android项目源代码下创建一个jni目录。

  4. 将之前编译的文件,include目录放置到jni目录下。

  5. 包含在jni目录下创建的OpenSSL库目录<OpenSSL source/include/>。

  6. 接下来在 jni/*.c 中编写C函数来实现加密。完成之后,你需要拷贝 *.a/*.so 以及头文件到项目之中。

  7. 在步骤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 &ndash;L -rf $OPENSSL_PATH/include/openssl jni/include
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值