NDK开发笔记——Android使用openssl

本文详细介绍如何在Android项目中集成OpenSSL库,包括获取源代码、使用Android NDK进行交叉编译的具体步骤及注意事项。文章还介绍了如何解决编译过程中出现的各种问题,例如头文件缺失、链接错误等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android自身使用了谷歌的openssl分支boringssl,因此,如果要在Android中使用openssl,需要编译成静态库集成在自己的程序当中。

为Android编译openssl,首先需要获取到openssl的源代码和Android ndk,利用ndk中的交叉编译工具链编译出需要的openssl库。具体的配置可参照https://www.jianshu.com/p/b790c548e787,我使用的ndk版本是r17b,openssl版本是1.1.0h

这里需要注意的是的Android NDK可能会缺少头文件,交叉工具链默认的包含目录是没有需要的包含目录的,需要手动添加

export C_INCLUDE_PATH='$ANDROID_NDK_ROOT/sysroot/usr/include/'

这里还可能遇到缺少asm目录下的头文件,这些头文件可以在ndk目录里找到对应工具链的asm目录拷贝出去,编译时缺少的头文件都可以在该文件夹下搜索并复制到对应目录。

编译完之后可能会有链接的问题,如

./libcrypto.a(bio_cb.o):bio_cb.c:function BIO_debug_callback: error: undefined reference to 'stderr'

这个问题跟编译选择的对应Android版本有关,在NDK的stdio.h中有如下的定义

#if __ANDROID_API__ >= __ANDROID_API_M__
extern FILE* stdin __INTRODUCED_IN(23);
extern FILE* stdout __INTRODUCED_IN(23);
extern FILE* stderr __INTRODUCED_IN(23);

/* C99 and earlier plus current C++ standards say these must be macros. */
#define stdin stdin
#define stdout stdout
#define stderr stderr
#else
/* Before M the actual symbols for stdin and friends had different names. */
extern FILE __sF[] __REMOVED_IN(23);

#define stdin (&__sF[0])
#define stdout (&__sF[1])
#define stderr (&__sF[2])
#endif

由于openssl编译时没有android api宏,当编译的目标版本小于android m也就是23的时候,编译会报错,这时编译指定android的版本大于23即可,这样做会对兼容性产生什么影响尚未验证。

编译成功生成了.a文件之后,将其放入app的工程中,可能也会产生各种编译的错误,这里需要调整sdk的版本和最小兼容版本,具体能兼容到哪个版本待验证。

编译成功之后运行时可能会产生java.lang.UnsatisfiedLinkError错误,大意是64位程序引用32位库的问题,

在生成的apk的lib中会有各个平台的文件夹比如armv8这里需要在build.gradle中写入

android {
    ...
    defaultConfig {
        ...
        ndk {
            abiFilter("armeabi-v7a")
        }
    }
}
来过滤掉其它的库

在gradle.properties中添加

android.useDeprecatedNdk=true

### Android Studio 系统文件错误修复方法 在开发过程中,Android Studio 的系统文件错误可能由多种原因引起,例如 R 文件丢失、依赖配置问题或缓存损坏等。以下是针对这些常见问题的解决方法: #### 1. 检查项目视图模式 如果遇到 R 文件找不到的问题,可以检查当前项目的视图模式是否为 `Android` 模式。默认情况下,`Android` 模式可能会隐藏一些生成的文件夹和文件。切换到 `Project` 或 `Packages` 模式可以帮助找到 R 文件的位置[^1]。 具体操作步骤如下: - 在 Android Studio 的左上角,点击视图模式下拉菜单。 - 将视图模式从 `Android` 切换为 `Project` 或 `Packages`。 - 在 `app/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r` 路径下查找 R 文件。 #### 2. 清理与重建项目 缓存或构建文件损坏可能导致系统文件错误。清理和重建项目通常能有效解决问题: ```bash # 在终端中运行以下命令 ./gradlew clean ./gradlew build ``` 或者直接通过 Android Studio 的菜单完成: - 点击菜单栏中的 `Build -> Clean Project`。 - 再次点击 `Build -> Rebuild Project`。 #### 3. 检查依赖配置 某些依赖库的版本冲突或配置错误可能导致 R 文件无法正确生成。确保 `build.gradle` 文件中的依赖项正确无误[^3]。例如: ```groovy dependencies { implementation 'com.zhy:okhttputils:2.6.1' } ``` 如果依赖库路径出现问题(如 `AndroidManifest.xml` 文件缺失或路径错误),需要重新下载依赖库或将正确的文件放入指定路径。 #### 4. 更新 Android Studio 和 Gradle 版本 旧版本的 Android Studio 或 Gradle 可能存在已知问题,建议将工具更新至最新版本。可以通过以下方式更新: - 打开 Android Studio,进入 `Help -> Check for Updates`。 - 在项目级 `build.gradle` 文件中更新 Gradle 插件版本: ```groovy classpath 'com.android.tools.build:gradle:7.0.4' // 示例版本号 ``` #### 5. 修复 SSL 错误 如果在导入资源文件时遇到 SSL 错误,可能是由于证书配置问题导致。尝试替换证书文件以解决问题[^2]: - 将原有的 `ca.cer` 和 `ca.key` 文件覆盖当前项目中的同名文件。 - 如果问题仍然存在,重新安装最新的 OpenSSL 库。 #### 6. 检查动态链接库 (DLL) 错误 如果系统提示缺少某些动态链接库(如 `xinput1-3.dll`),可以按照以下步骤解决: - 下载并解压包含 `xinput1-3.dll` 的压缩包。 - 将该文件复制到系统的 `C:\Windows\System32` 文件夹中。 - 如果问题仍未解决,重新安装 DirectX 9.0 或更高版本[^2]。 #### 7. 删除无效文件或路径 某些情况下,项目中可能存在无效的文件或路径引用,导致编译失败。可以通过递归删除特定文件来解决问题[^2]。以下是一个 Java 实现示例: ```java import java.io.File; public class FileDeleter { public static void main(String[] args) { deleteFiles(new File("your_directory_path"), "pylist.txt"); } public static void deleteFiles(File directory, String fileName) { if (directory.isDirectory()) { for (File file : directory.listFiles()) { if (file.isDirectory()) { deleteFiles(file, fileName); } else if (file.getName().equals(fileName)) { file.delete(); } } } } } ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值