如何在 ANDROID 应用程序中使用 openSSL 库

Posted

技术标签:

【中文标题】如何在 ANDROID 应用程序中使用 openSSL 库【英文标题】:How to use openSSL Library in the ANDROID application 【发布时间】:2011-03-04 01:25:30 【问题描述】:

我正在尝试使用 android NDK 将 openssl 库嵌入到我的 Android 应用程序中,但我不知道如何准确使用该库,所以请任何人告诉我如何使用它,请发送源代码供我参考.......

相关:

How to build OpenSSL on Android/Linux ?

【问题讨论】:

【参考方案1】:

您尝试过吗,它是 Android 中包含的 openssl 的独立版本: https://github.com/fries/android-external-openssl/blob/master/README.android

【讨论】:

我们现在实际上维护了我们自己的版本:github.com/guardianproject/android-ffmpeg 我们正在使用 Guardianproject 中提供的 openssl 构建。由于最近的 android playstore 安全警报,我现在正在尝试升级 openssl 版本。我按照自述文件中的步骤操作,但被困在:5) 构建前清理:m -j16 clean-libcrypto clean-libssl clean-openssl clean-ssltest。据我所知,当您设置从源代码构建 android 时 m 和 mm 可用,所以我得到 m: command not found 并且在下一步中与 mm 相同。非常感谢任何帮助! @Nonos 你有任何解决方案来更新 OpenSSL 的版本吗?我也陷入了第 5 步。如果你能帮助我,Herte 是我的question。【参考方案2】:

在 Android 中使用 OpenSSL 有几个技巧:

    必须使用 NDK 工具构建 OpenSSL 库,否则会与 NDK 不兼容。 Compiling the latest OpenSSL for Android

    CC=~/android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc
    ./Configure android-armv7
    export ANDROID_DEV=~/android-ndk-r9//platforms/android-8/arch-arm/usr
    make build_libs
    

    假设这些命令是在OpenSSL的源码目录下执行的。

    为了将这些库(ssl 和加密)与您自己的 NDK 库一起使用,您需要在 jni 文件夹中创建额外的 *.mk 文件。例如:

    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := ssl-crypto
    LOCAL_SRC_FILES := openssl-crypto/libcrypto.so
    
    include $(PREBUILT_SHARED_LIBRARY)
    

    并将它们包含在主 Android.mk 中:

    include $(LOCAL_PATH)/openssl-ssl/Android.mk
    

    并且可能添加

    include $(CLEAR_VARS) 
    

    在它之后以避免错误。库将被放入libs/armabi.apk

    如果您遇到could not load library ... needed by ... 错误,那么这可能意味着您的库有带有版本号的soname。 AFAIK NDK 目前无法使用此类库。有一个解决方法(Dalvik is looking for .so file with '.0' extension - why?):

    rpl -R -e library.so.1.1 "library.so\x00\x00\x00\x00" libs obj
    

    rpl 是一个 linux 字符串替换工具。在构建之后和运行应用程序之前运行此脚本,它将从项目文件中删除版本号。点击链接了解更多信息。

    如果您使用 C++ 编译器,您的 C 函数中可能会出现“未定义引用”错误。使用extern "C" 来避免这种情况(有关更多信息,请参阅“C++ 名称修改”)。

    最后确保清单中有网络权限。

【讨论】:

我应该如何在 Java 中加载 libcrypto.so?我使用了System.loadLibrarySystem.load,但出现apk使用/system/lib下的libcrypto.so,因为在Android 4.2 libcrypto.so中找不到新功能。

以上是关于如何在 ANDROID 应用程序中使用 openSSL 库的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中使用 Open GL Framebuffer 时如何转换图像

Android 如何在新的 sdk 3.0 中与 Facebook Open Graph 共享数据?

使用 open cv 和 java 在 Android 中单击时获取图像尺寸?

在 Android 中的 window.open() 之后 setInterval() 不起作用

如何使用 Cordova 在 Android 上实现打印?

如何在没有用户交互的情况下启动 Open Camera 应用程序来拍照?