Android下编译OpenSSL静态库

本文描述的操作都是在Linux下进行,使用最新的NDK编译。

第一步:下载源代码

mkdir openssl-build

cd openssl-build

git clone git://android.git.kernel.org/platform/external/openssl.git

目前版本是1.0.0a,比通用的OpenSSL的版本略低。

第二步:建立工程文件

cd openssl-build

创建三个文件 AndroidManifest.xml and default.properties, Application.mk,使NDK-build能找到相关文件进行编译,否则会提示找不到工程文件。

下文中设置支持的API版本为7,可根据自己的需要调整,

ABI设置了armeabi-v7a,如果不需要的话可以去掉。

cat > AndroidManifest.xml <<"EOF"

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="org.openssl.android"

android:versionCode="1"

android:versionName="1.0">

<uses-sdk android:minSdkVersion="7" />

</manifest>

EOF

cat > default.properties <<"EOF"

target=android-7

EOF

mkdir jni

cat > ./jni/Application.mk <<"EOF"

APP_PROJECT_PATH := $(shell pwd)

APP_BUILD_SCRIPT := $(APP_PROJECT_PATH)/Android.mk

APP_ABI := armeabi armeabi-v7a

APP_PLATFORM := android-7

EOF

第三步:修改make文件

默认的make文件编译生成动态库,需要改为静态苦,头文件的路径也需要做调整。

openssl-build/android-config.mk:

LOCAL_CFLAGS中去掉-DDSO_DLFCN -DHAVE_DLFCN_H(API版本为7不支持DLFCN的一些特性,所以需要去掉)。

LOCAL_CFLAGS += -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN #-DTERMIO

修改为

LOCAL_CFLAGS += -DOPENSSL_THREADS -D_REENTRANT -DL_ENDIAN #-DTERMIO

openssl-build/apps/Android.mk:

需要把头文件包含路径中的external/openssl替换为$(NDK_PROJECT_PATH),也就是把

external/openssl /

external/openssl/include

修改为

$(NDK_PROJECT_PATH) /

$(NDK_PROJECT_PATH)/include

另外还需要连接libz(我们这里没有下载libz的源代码,因为NDK中已经有libz了,直接调用即可),加上下面的两条。

LOCAL_LDLIBS += -lz

openssl-build/crypto/Android.mk:

需要把头文件包含路径中的external/openssl替换为$(NDK_PROJECT_PATH),同时删掉zlib的包含路径,也就是把

external/openssl /

external/openssl/crypto/asn1 /

external/openssl/crypto/evp /

external/openssl/include /

external/openssl/include/openssl /

external/zlib

修改为

$(NDK_PROJECT_PATH) /

$(NDK_PROJECT_PATH)/crypto/asn1 /

$(NDK_PROJECT_PATH)/crypto/evp /

$(NDK_PROJECT_PATH)/include /

$(NDK_PROJECT_PATH)/include/openssl

另外还需要连接libz,加上下面的一句

LOCAL_LDLIBS += -lz

要编译静态库,所以把include $(BUILD_SHARED_LIBRARY) 修改为 include $(BUILD_STATIC_LIBRARY)。

我们不需要编译Host库,所以可以把include $(BUILD_HOST_SHARED_LIBRARY)之类的都注释掉。

openssl-build/ssl/Android.mk:

需要把头文件包含路径中的external/openssl替换为$(NDK_PROJECT_PATH),也就是把

external/openssl /

external/openssl/include /

external/openssl/crypto

修改为

$(NDK_PROJECT_PATH) /

$(NDK_PROJECT_PATH)/include /

$(NDK_PROJECT_PATH)/crypto

要编译静态库,所以把include $(BUILD_SHARED_LIBRARY) 修改为 include $(BUILD_STATIC_LIBRARY)。

第四步:编译

cd openssl-build

ndk-build

编译的静态库在obj目录下面。


报错处理:

期间报错,现在将报错和解决方法贴出来

第一个错误:

/home/ss/android-ndk-r8d/build/gmsl/__gmsl:512: *** non-numeric second argument to `wordlist' function: ''. Stop.

解决方法:

修改build/gmsl/__gmsl文件的 第512行

int_encode = $(__gmsl_tr1)$(wordlist 1,$1,$(__gmsl_input_int)) 改为

int_encode = $(__gmsl_tr1)$(wordlist 1,$(words $1),$(__gmsl_input_int))



更多相关文章

  1. 64位Ubuntu配置android环境报错(...adb": error=2, 没有那个文件
  2. android中使用properties文件配置
  3. Android布局文件属性
  4. android从raw里面读取txt文件
  5. android直接找一个文件,部分编译等实用
  6. Android 保存文件路径方法
  7. Android引用百度定位API第三方组件后导致其它.so文件无法正常加
  8. Android上传文件之FTP

随机推荐

  1. Ubuntu中手动安装配置JDK, Android(安卓)
  2. 如何让 android 完全退出
  3. Android数据库开源框架GreenDao分析
  4. Android(安卓)默认AP名字,以及AP名字存储
  5. android 监听手机电量变化
  6. android 3D-纹理------球的纹理
  7. 解决Android(安卓)sdk manager无法访问go
  8. spring mvc + mybatis 构建 cms 内容发布
  9. Android为ListView的Item设置不同的布局
  10. Android快速开发工具:AndroidAnnotations: