【问题标题】:Renaming a shared object extension for Android为 Android 重命名共享对象扩展
【发布时间】:2014-10-14 09:15:26
【问题描述】:

我已经为 Android 构建了 OpenSSL。这生成了一个扩展名为.so.1.0.0 的so,以及一个扩展名为.so 的符号链接。这对 Android 来说当然是个问题,因为它希望所有共享库都具有 .so 格式的扩展名。

(此外,我还有一些其他预构建的库需要名为 libssl.so 的文件。)

因此,我需要一个以 .so 结尾的库,并且所有依赖它的库都需要链接到扩展名为 .so 的文件。这里的 OpenSSL 说明:http://wiki.openssl.org/index.php/Android 建议将文件重命名为 libssl.so。我已经做到了。

但是,当我尝试使用 ajb-tools (https://subversion.assembla.com/svn/ajb-tools/trunk/android/android-cross/android-cross),使用 -lopenssl 构建我自己的库(也需要 openSSL)时,该库仍然具有 soname “libssl.so.1.0.0”生成显然需要格式为 libssl.so.1.0.0 的库文件的共享对象,该文件在构建时不再存在。在运行时,Android 应用程序抱怨它找不到这个文件。

我尝试将-l:libssl.so 放入我的库的makefile 中,但无济于事。 readelf -d 仍然报告我的库需要 libssl.so.1.0.0。

有没有办法强制库链接到特定的文件名。或者我是否必须以这样的方式构建 OpenSSL,它会生成一个 soname 设置为“.so”的库?

【问题讨论】:

标签: android android-ndk openssl java-native-interface shared-libraries


【解决方案1】:

最后,我手动编辑了 OpenSSL 的 Makefile.shared,并更改了共享库构建中的 -soname 参数以省略版本名称。这行得通。虽然我确信可以找到更优雅的解决方案。

【讨论】:

  • 注意 libssl.so 在 Android 应用程序中很难使用,因为在典型的 Android 发行版中,具有此类名称的文件存在于 /system/lib 目录中,并且此目录优先于您的应用程序私有库目录。一方面,这可能意味着您可以依赖系统库而不用浪费时间来构建和维护 OpenSSL。但是,如果您的应用需要一些系统库中没有的功能或修复,您必须重命名库,并确保所有引用都指向新重命名的库。 libssl.1.0.0.so 将是一个选项。
【解决方案2】:

如您所知,Android 需要取消版本库。
我对你的建议是编写一个 Android.mk 并使用 ndk-build。
示例:参见 libusbx (https://github.com/libusb/libusb)

【讨论】:

  • 找不到github链接页面
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多