使用原生方法时,android loadLibrary失败

时间:2018-08-06 09:45:39

标签: android android-ndk

在我的测试项目中,我使用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文件“ /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开发人员的新手,所以任何想法对我都会有所帮助。

更新 screen

1 个答案:

答案 0 :(得分:0)

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

但是,如果您打算在Play商店中分发应用,则还应该学习为arm64构建第三方库。 Google announced于2019年8月达到此要求。