首页 > 解决方案 > 使用本机方法时,android loadLibrary 失败

问题描述

在我的测试项目中,我使用 android "pay.cards" 库 ( https://github.com/faceterteam/PayCards_Android ) 我将它包含为 AAR 并且它工作正常。

compile(name:'paycards-sdk-release', ext:'aar')

然后我添加了项目本地方法调用。

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("native-lib");
    }

    private native String getFirstName();

    private native String getLastName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ((TextView)findViewById(R.id.tv1)).setText(getFirstName());
        ((TextView)findViewById(R.id.tv2)).setText(getLastName());
    }

}

externalNativeBuild {
    cmake {
        path 'CMakeLists.txt'
    }
}
...

之后,pay.scan 库无法加载库:

static {
    System.loadLibrary("opencv_java3");
    System.loadLibrary("cardrecognizer");
}

在这种情况下,抛出 java.lang.UnsatisfiedLinkError。

dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/-2/base.apk"],nativeLibraryDirectories=[/lib/arm64, /system/fake-libs64, /data/app/-2/base .apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]] 找不到“libopencv_java3.so”

但是,当我禁用自己的本机方法(只是从 build.gradle 中删除 externalNativeBuild 部分)时,一切都会再次按预期工作。

任何人都可以在这种情况下提出建议吗?

我是 NDK 开发的新手,所以任何想法都会对我有所帮助。

更新 屏幕

标签: androidandroid-ndk

解决方案


如您所见,cardrecognizer库是为 32 位 ARM (armeabi-v7a) 构建的。在短期内,您可以为相同的 ABI 构建本地库。这通常由build.gradle脚本中的abiFilters控制。

但是如果你打算在 Play Store 上发布你的应用程序,你也应该学习为 arm64 构建第三方库。谷歌在 2019 年 8 月宣布了这一要求。


推荐阅读