2013-03-21 168 views
2

我正在使用NDK为Android编写原生lib(mylib.so)。 Mylib.so取决于libssl.so。在原生Android应用中使用libssl.so

Android NDK doc告诉我,我不应该在system/lib中使用libssl.so,因为它不是稳定API的一部分。相反,我应该自己交叉编译libssl并将其添加到NDK。

但是我发现mylib.so会自动链接到system/lib/libssl.so,因为dalvik vm(正在加载mylib.so)已经取决于libssl.so。

$ readelf -d /system/bin/dalvikvm | grep Shared 
0x00000001 (NEEDED)      Shared library: [libdvm.so] 
0x00000001 (NEEDED)      Shared library: [libssl.so] 
0x00000001 (NEEDED)      Shared library: [libz.so] 
0x00000001 (NEEDED)      Shared library: [libc.so] 
0x00000001 (NEEDED)      Shared library: [libstdc++.s 
0x00000001 (NEEDED)      Shared library: [libm.so] 

那么,处理这个问题的正确方法是什么?无论如何使用system/lib/libssl.so?

感谢

+0

您可以链接到的libssl'mylib.so'作为静态库('libssl.a')? – fadden 2013-03-21 21:33:56

+0

我可能会静态链接,但我不确定这是否是一种通用解决方案,例如在同一个应用程序中的两个库都需要libssl的情况下。要指定我的问题:是否安全地动态链接到system/lib/libssl.so,知道它不是一个稳定的API?有其他人尝试过吗?使用system/lib/libssl.so时是否存在缺陷或功能差距?谢谢 – user2194434 2013-04-05 13:41:29

+2

与非公共图书馆联系并不安全。系统更新时它们可能会更改,可能会破坏您的应用程序。另一个想法是将libssl.so重命名为其他内容(libssl-mine.so)并链接到该目录;这将阻止动态链接器“聪明”并找到系统的实现。 – fadden 2013-04-05 15:58:15

回答

0

这听起来像这个问题可能是在你的Android.mk文件。假设你已经成功通过交叉编译你想成为一个.so文件的libssl版本,你会希望做一个新的模块在你的Android.mk文件看起来像下面这样:

include $(CLEAR_VARS) 
LOCAL_MODULE := libssl-prebuilt 
LOCAL_SRC_FILES := libssl.so 
LOCAL_EXPORT_C_INCLUDES := /path/to/the/include/files/for/libssl.so 
include $(PREBUILT_SHARED_LIBRARY) 

的上面的模块将您本地的预建版本的libssl.so添加到您的本地项目中。如果在编译mylib.so时想要链接本地版本的libssl.so,则必须将以下条目添加到您的mylib模块中。

LOCAL_SHARED_LIBRARIES := libssl-prebuilt 
相关问题