首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何为Android构建[openSSL-1.0.2u],如果可能,如何合并Android Makefile?

为Android构建openSSL-1.0.2u的过程如下:

  1. 下载openSSL源代码: 首先,你需要从openSSL官方网站下载openSSL-1.0.2u的源代码包。你可以访问openSSL的官方网站(https://www.openssl.org/)或使用其他可信的源获取openSSL源代码。
  2. 解压源代码包: 将下载的openSSL源代码包解压到你的开发环境中。
  3. 打开终端: 进入解压后的openSSL源代码目录,并打开终端。
  4. 设置环境变量: 执行以下命令,设置必要的环境变量: export ANDROID_NDK=/path/to/android-ndk export PATH=$ANDROID_NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin:$PATH
  5. 注意:将/path/to/android-ndk替换为你的Android NDK路径。该路径应指向你的Android NDK安装位置。
  6. 配置Makefile: 在openSSL源代码目录中,找到并打开名为"Setenv-android.sh"的文件。根据你的需求,修改该文件中的以下变量:
    • ANDROID_NDK_ROOT:设置为你的Android NDK路径。
    • ARCH_NAME:设置为你的目标Android架构(如armeabi-v7a、arm64-v8a、x86等)。
    • ANDROID_API:设置为你的目标Android API级别。
  • 生成Makefile: 执行以下命令,生成Makefile文件: ./Configure android-$ARCH_NAME no-asm no-shared no-hw --openssldir=/path/to/output/folder
  • 注意:将/path/to/output/folder替换为你希望输出文件的路径。这将是openSSL构建生成的库文件的存储位置。
  • 编译并构建openSSL: 执行以下命令,开始编译并构建openSSL: make depend make -j4
  • 注意:这里的"-j4"参数表示使用4个线程并行编译。你可以根据你的机器性能调整该值。
  • 完成构建: 构建完成后,你将在之前指定的输出文件夹中找到生成的openSSL库文件。

合并Android Makefile的过程如下:

如果你希望将openSSL构建过程合并到Android的Makefile中,可以按照以下步骤进行操作:

  1. 打开Android项目的Makefile文件: 打开你的Android项目中的Makefile文件。
  2. 添加openSSL构建规则: 在Makefile文件中,添加以下规则来构建openSSL: include $(CLEAR_VARS) LOCAL_MODULE := libcrypto LOCAL_SRC_FILES := /path/to/openssl/libcrypto.a include $(PREBUILT_STATIC_LIBRARY)
  3. include $(CLEAR_VARS) LOCAL_MODULE := libssl LOCAL_SRC_FILES := /path/to/openssl/libssl.a include $(PREBUILT_STATIC_LIBRARY)
  4. 注意:将/path/to/openssl替换为你之前构建openSSL生成的库文件路径。
  5. 添加依赖关系: 在你的Android模块的依赖关系中,添加以下依赖项: LOCAL_STATIC_LIBRARIES += libcrypto LOCAL_STATIC_LIBRARIES += libssl
  6. 重新编译你的Android项目: 执行你通常用于编译Android项目的命令,确保openSSL被正确链接到你的项目中。

注意:以上步骤假定你已经熟悉Android开发环境、Makefile文件的语法和Android构建流程。对于每个特定的Android项目,可能需要根据项目配置和需求进行适当的调整。

希望这个答案能帮到你!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

automake编译和安装方式说明

作为良好的习惯,建议为第三方库建立专门的目录,目录取名为thirdparty。然后,再在thirdparty下建立名叫src_package,用来存放第三方库的源码包,如没有特别说明,第三方库默认均为automake编译和安装方式。并且,一般建议将第三方库安装在thirdparty目录下,而不是系统的/usr/local目录下,目的是尽量减少对系统目录的污染,保持系统目录的整洁。 【automake编译和安装方式说明】 通常Linux系统自带automake编译工具,C/C++开源库一般都采用automake编译。 假设源代码库文件名为protobuf-2.4.1.tar.gz,则编译和安装操作步骤如下: 1) 将源代码包文件protobuf-2.4.1.tar.gz上传到Linux机上,这里假设上传到Linux机的/tmp目录 2) 进入/tmp目录 3) 解压源代码包文件:tar xzf protobuf-2.4.1.tar.gz,完成后会在/tmp目录下会出现一个子目录protobuf-2.4.1 4) 进入/tmp的子目录子目录protobuf-2.4.1 5) 执行configure命令,以生成Makefile文件:./configure --prefix=/usr/local/protobuf-2.4.1,这里假设将Protocol Buffers安装到/usr/local/protobuf-2.4.1 6) 上一步会生成编译用的Makefile文件,接下来执行make编译:make 7) make成功后,再执行make install安装 8) 成功后,就可以ls /usr/local/protobuf-2.4.1查看安装结果了; 9) 建立不带版本号的软链接:ln -s /usr/local/protobuf-2.4.1 /usr/local/protobuf 【automake编译和安装方式补充说明】 a) 源代码包如果是protobuf-2.4.1.tar.bz2形式,则表示是bzip2压缩包,而protobuf-2.4.1.tar.gz是gzip压缩包,对于bzip2压缩包,tar解压参数请由xzf改成xjf b) 上述第9步不是必须的,但会是一个良好的Linux风俗,建议保持 c) 注意第5步,如果生成的静态库会被其它共享库使用,则可能需要为configure增加参数,否则在链接生成共享库时,可能会报被链接的静态库需要带-fPIC参数重新编译,这个问题不难解决,如下变通一下即可: ./configure --prefix=/usr/local/protobuf-2.4.1 CXXFLAGS=-fPIC LDFLAGS=-fPIC d) 开源的C/C++库源代码包文件一般都采用类似于protobuf-2.4.1.tar.gz的命名方式 【推荐的编译环境目录结构】 假设有一项目mooon,它的目录结构如下,和SVN目录结构保持一致,但SVN上不存放中间目录和文件,mooon本身可以基于用户主目录,或者其它合适的目录,如/data目录下: mooon |-- doc |-- src `-- thirdparty     |-- apr-util     |-- boost     |-- gflags     |-- protobuf     |-- sqlite     |-- src_package     |   |-- apr-util-1.5.1.tar.gz     |   |-- boost_1_53_0.tar.gz     |   |-- cgicc-3.2.10.tar.gz     |   |-- gflags-2.0.tar.gz     |   |-- protobuf-2.4.1.tar.gz     |   |-- sqlite-autoconf-3071401.tar.gz     |   `-- thrift-0.9.0.tar.gz     `-- thrift 安装openssl:  # ./config --prefix=/usr/local/thirdparty/openssl-1.0.2a shared threads 安装httpd(apache),支持https:  # ./configure --with-apr=/usr/local/thirdparty/apr-1.4.6 --with-apr-util=/usr/local/thirdparty/apr-util-1.5.1 --with-ssl=/usr/local/thirdparty/openssl-1.0.2a --with-pcre=/usr/local/thirdpar

03

C/C++常见gcc编译链接错误解决方法

用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdynamic”指定链接共享库,使用示例: -Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto -Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest ("-Wl"表示是传递给链接器ld的参数,而不是编译器gcc/g++的参数。) 1) 下面是因为没有指定链接参数-lz(/usr/lib/libz.so,/usr/lib/libz.a ) /usr/local/mysql/lib/mysql/libmysqlclient.a(my_compress.c.o): In function `my_uncompress': /home/software/mysql-5.5.24/mysys/my_compress.c:122: undefined reference to `uncompress' /usr/local/mysql/lib/mysql/libmysqlclient.a(my_compress.c.o): In function `my_compress_alloc': /home/software/mysql-5.5.24/mysys/my_compress.c:71: undefined reference to `compress' 2) 下面是因为没有指定编译链接参数-pthread(注意不仅仅是-lpthraed) /usr/local/mysql/lib/mysql/libmysqlclient.a(charset.c.o): In function `get_charset_name': /home/zhangsan/mysql-5.5.24/mysys/charset.c:533: undefined reference to `pthread_once' 3) 下面这个是因为没有指定链接参数-lrt /usr/local/thirdparty/curl/lib/libcurl.a(libcurl_la-timeval.o): In function `curlx_tvnow': timeval.c:(.text+0xe9): undefined reference to `clock_gettime' 4) 下面这个是因为没有指定链接参数-ldl /usr/local/thirdparty/openssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup': dso_dlfcn.c:(.text+0x4c): undefined reference to `dlopen' dso_dlfcn.c:(.text+0x62): undefined reference to `dlsym' dso_dlfcn.c:(.text+0x6c): undefined reference to `dlclose' 5) 下面这个是因为指定了链接参数-static,它的存在,要求链接的必须是静态库,而不能是共享库 ld: attempted static link of dynamic object 如果是以-L加-l方式指定,则目录下必须有.a文件存在,否则会报-l的库文件找不到:ld: cannot find -lACE 6) GCC编译遇到如下的错误,可能是因为在编译时没有指定-fPIC,记住:-fPIC即是编译参数,也是链接参数 relocation R_x86_64_32S against `vtable for CMyClass` can not be used when making a shared object 7) 下面的错误表示gcc编译时需要定义宏__STDC_FORMAT_MACROS,并且必须包含头文件inttypes.h test.cpp:35: error: expected `)' before 'PRIu64' 8) 下面是因为在x86机器(32位)上编译没有指定编译参数-march=pentium4 ../../src/common/libmooon.a(logger.o): In function `atomic_dec_and_test': ../../include/mooon/sys/atomic_gcc.h:103: undefined reference to `__sync_sub_and_fetch_4' 9) 下列错误可能是因为多了个“}” error: expected d

03

Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结

都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统。跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL硬件抽象层。 大多数时候,我们使用JVM语言进行编程,比如传统的Java或者新贵Kotlin。碰到对速度比较敏感的项目,比如游戏,比如视频播放。我们就会用到Android的JNI技术,使用NDK的支持,利用C++开发高计算量的模块,供给上层的Java程序调用。 本文先从一个最简单的JNI例子来开始介绍Android中Java和C++的混合编程,随后再介绍Android直接调用ELF命令行程序的规范方法,以及调用混合了第三方库略微复杂的命令行程序。

04
领券