android - 使用本机方法时,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 开发的新手,所以任何想法都会对我有所帮助。
解决方案
如您所见,cardrecognizer库是为 32 位 ARM (armeabi-v7a) 构建的。在短期内,您可以为相同的 ABI 构建本地库。这通常由build.gradle脚本中的abiFilters控制。
但是如果你打算在 Play Store 上发布你的应用程序,你也应该学习为 arm64 构建第三方库。谷歌在 2019 年 8 月宣布了这一要求。
推荐阅读
- reactjs - 类型属性依赖于另一个属性的返回类型
- html - 更改浏览器大小时网站混乱
- javascript - 使用 i18next 进行反应生产构建会导致翻译仅显示字符串
- reactjs - 将数据从 UseEffect 传递到 Chart.js 不起作用
- ios - 为什么我收到错误“类型‘PublicTableViewController’没有成员‘handleRefresh’’
- python - 计算与新列中平均值的差异
- sql-server - 从 SQL Server 2012 到 2008 R2 的 LoadData 问题将日期日期类型加载到日期时间数据类型列中
- java - Spring Boot 休息控制器错误消息始终为空
- git - 在不更改 HEAD 的情况下,在大型提交中为单个文件发生的命令行更改中显示 git
- python-3.x - SQLite:SQL 变量太多