UnsatisfiedLinkError: libcrypto.so.1.0.0 not found

Posted

技术标签:

【中文标题】UnsatisfiedLinkError: libcrypto.so.1.0.0 not found【英文标题】: 【发布时间】:2016-01-11 06:35:30 【问题描述】:

我在 Eclipse 中使用 android ndk。我编译了我的项目,但在运行时遇到错误。我有libcrytpoNative.solibsslNative.so 文件,但我收到关于libcrypto.so.1.0.0 未找到错误的错误。我应该如何解决这个问题?

这是ndk-build V=1的输出

    Android NDK: WARNING: APP_PLATFORM android-21 is larger than android:minSdkVersion 14 in ./AndroidManifest.xml    
    rm -f ./libs/arm64-v8a/lib*.so ./libs/armeabi/lib*.so ./libs/armeabi-v7a/lib*.so ./libs/armeabi-v7a-hard/lib*.so ./libs/mips/lib*.so ./libs/mips64/lib*.so ./libs/x86/lib*.so ./libs/x86_64/lib*.so
    rm -f ./libs/arm64-v8a/gdbserver ./libs/armeabi/gdbserver ./libs/armeabi-v7a/gdbserver ./libs/armeabi-v7a-hard/gdbserver ./libs/mips/gdbserver ./libs/mips64/gdbserver ./libs/x86/gdbserver ./libs/x86_64/gdbserver
    rm -f ./libs/arm64-v8a/gdb.setup ./libs/armeabi/gdb.setup ./libs/armeabi-v7a/gdb.setup ./libs/armeabi-v7a-hard/gdb.setup ./libs/mips/gdb.setup ./libs/mips64/gdb.setup ./libs/x86/gdb.setup ./libs/x86_64/gdb.setup
    [armeabi-v7a] Install        : libcpabe.so => libs/armeabi-v7a/libcpabe.so
    install -p ./obj/local/armeabi-v7a/libcpabe.so ./libs/armeabi-v7a/libcpabe.so
    /home/yogi/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded  ./libs/armeabi-v7a/libcpabe.so
    [armeabi-v7a] Install        : libcryptoNative.so => libs/armeabi-v7a/libcryptoNative.so
    install -p ./obj/local/armeabi-v7a/libcryptoNative.so ./libs/armeabi-v7a/libcryptoNative.so
    /home/yogi/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded  ./libs/armeabi-v7a/libcryptoNative.so
    [armeabi-v7a] Install        : libglib.so => libs/armeabi-v7a/libglib.so
    install -p ./obj/local/armeabi-v7a/libglib.so ./libs/armeabi-v7a/libglib.so
    /home/yogi/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded  ./libs/armeabi-v7a/libglib.so
    [armeabi-v7a] Install        : libgmp.so => libs/armeabi-v7a/libgmp.so
    install -p ./obj/local/armeabi-v7a/libgmp.so ./libs/armeabi-v7a/libgmp.so
    /home/yogi/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded  ./libs/armeabi-v7a/libgmp.so
    [armeabi-v7a] Install        : libpbc.so => libs/armeabi-v7a/libpbc.so
    install -p ./obj/local/armeabi-v7a/libpbc.so ./libs/armeabi-v7a/libpbc.so
    /home/yogi/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded  ./libs/armeabi-v7a/libpbc.so
    [armeabi-v7a] Install        : libsslNative.so => libs/armeabi-v7a/libsslNative.so
    install -p ./obj/local/armeabi-v7a/libsslNative.so ./libs/armeabi-v7a/libsslNative.so
    /home/yogi/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded  ./libs/armeabi-v7a/libsslNative.so

这是加载库的 MainActivity.java:

包 com.example.myproject;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends Activity 

    static 
        System.loadLibrary("gmp");             
//        System.loadLibrary("ssl");
//        System.loadLibrary("crypto");
        System.loadLibrary("glib");
        System.loadLibrary("pbc"); 
        System.loadLibrary("sslNative");
        System.loadLibrary("cryptoNative");
        System.loadLibrary("cpabe");          
    

    //System.loadLibrary("ssl_static");


    public static native void InitMainActivityjni();
    public native String cpabeNative();

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        TextView  tv = new TextView(this);
        tv.setText(cpabeNative());
        setContentView(tv);
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) 
            return true;
        
        return super.onOptionsItemSelected(item);
    


谢谢

【问题讨论】:

在运行时加载这些库的行是什么?在(至少)您的一个 java 文件中,您应该有类似 System.loadLibray(libname) 的内容。 另见Changing OpenSSL library in Android app for HttpClient。它讨论了 Zygote 以及提供您自己的 libcrytpo.solibssl.so 副本的问题。 @sonic: System.loadLibray("ssl"); System.loadLibray("crypto"); 进入命令行,手动运行ndk-build V=1。然后,将结果发布到 Pastebin。 (Stack Overflow 有类似 Pastebin 的服务吗?) @jww:是的,正如你提到的,我猜它是用 system/openssl 初始化的。我觉得从你的回答中理解起来太复杂了。如果可能的话,你能分享 armeabi-v7 的文件吗?抱歉给您添麻烦 【参考方案1】:

我遇到了类似的问题。 Android 不喜欢版本化的库文件,在这种情况下,单独更改 .so 库的文件名是行不通的。运行readelf 是查看分配给库的实际名称的一个好技巧(如果您的.so 文件是elf 格式,如果不是,请参阅this 帖子了解其他选项)。

运行此程序后,您需要查找出现在DEPENDSONAME 下的项目。如果您看到版本化的 .so.1.0.0 名称,请继续阅读,拯救即将来临 :)

现在,您基本上有两个选择 - 或者重新编译您的 libcrypto.so 和 libssl.so,这次添加适当的标志以防止它附加版本后缀,或者编辑库以删除版本后缀。我将展示如何执行第二个选项。

确保您已安装 rpl 命令行工具。如果不是,请运行:

brew install rpl

您可能需要使用sudo 运行此程序。

安装此工具后,您需要使用它来编辑 ssl 和加密库中的符号,如下所示:

rpl -R -e .so.1.0.0 "_1_0_0.so" /path/to/libssl.so
rpl -R -e .so.1.0.0 "_1_0_0.so" /path/to/libcrypto.so

快完成了!

再次运行readelf 工具以确保符号已正确更改。现在唯一要做的就是将实际文件名更改为libssl_1_0_0.so & libcrypto_1_0_0.so,并且在加载库时,请确保使用调整后的文件名:

System.loadLibrary("ssl_1_0_0");
System.loadLibrary("crypto_1_0_0");

现在应该可以了。希望这能解决您的问题。

【讨论】:

谢谢,这救了我的命。它解决了我的问题:与系统 AOS 5.x 加载冲突名称 "现在,你基本上有两个选择 - 或者重新编译你的 libcrypto.so 和 libssl.so,这次添加适当的标志,防止它附加版本后缀,"你知道怎么做这?我无法弄清楚openssl 1.1.1。我在文档中也找不到任何内容。

以上是关于UnsatisfiedLinkError: libcrypto.so.1.0.0 not found的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.UnsatisfiedLinkError:dlopen失败:库“/system/lib/libssl.so”

java.lang.unsatisfiedLinkError lib not found :(未能链接 mylib.so)

so没有打包进AKP导致java.lang.UnsatisfiedLinkError: dlopen failed: library “lib.so“ not found

添加jdplay aar时出现 UnsatisfiedLinkError错误

Android NDK常见SO加载错误UnsatisfiedLinkError解决方案

java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/xxx/lib/arm/liblame.so: has text relocation