警告:libcryptopp.so:缺少DT_SONAME将使用basename作为替换

时间:2016-12-21 04:37:15

标签: android android-ndk crypto++

我正在尝试构建libcryptopp.so并将其包含在我的JNI代码中,请按照Android Crypto++中的指南操作,我遇到了以下问题。

Crypto ++ 5.6.3中缺少符号问题

最初我使用的是Crypto ++ 5.6.3,我遇到了这个问题:

 java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_Z9GlobalRNGv" 

referenced by "/data/app/com.example.administrator.jnitest-2/lib/arm/libcryptopp.so"...

我查看libcryptopp.so

$ readelf -Ws libcryptopp.so | grep _Z9GlobalRNGv
1406: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _Z9GlobalRNGv
15836: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _Z9GlobalRNGv

切换到Crypto ++ 5.6.4解决了这个问题,但我仍然不知道原因并遇到了另一个问题:

缺少DT_SONAME

12-21 09:50:20.837 21677-21677/com.example.administrator.jnitest   
W/linker: /data/app/com.example.administrator.jnitest- 1/lib/arm/libcryptopp.so: is missing DT_SONAME will use basename as a 
replacement: "libcryptopp.so"

实际上这只是警告,应用不会崩溃。

我使用的是最新版本的android Mashwallow MOB31K。 有人使用其他库也遇到了类似的问题

https://github.com/bytedeco/javacpp-presets/issues/188

在Android N-preview上。

为什么我收到警告,如何解决?

1 个答案:

答案 0 :(得分:2)

经过一些尝试后,我找到了一个不完善的解决方案。

看来android N转向现在需要库版本。

在构建时打开 SONAME 标记。

Cryptopp默认关闭版本标志。在GNUmakefile-cross中:

HAS_SOLIB_VERSION ?= 0

将值设置为1:

HAS_SOLIB_VERSION ?= 1

构建,然后使用生成的.so文件。警告会发生。

问题是库不能在android 5.0上运行。所以我们现在最好不要单独留下这个警告。