首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android 11 JNI禁用fdsan

Android 11 JNI禁用fdsan
EN

Stack Overflow用户
提问于 2021-09-21 10:17:03
回答 1查看 927关注 0票数 5

我有一个应用程序,它使用带有原生库的库,现在在Android 11中,由于fdsan而崩溃。

我已经联系了图书馆的提供者,但是他们不会在这个问题解决后交付一个新版本的库,所以我需要能够以某种方式禁用fdsan。

我认为解决方案是,当我在Android 11或更高版本的时候打电话:

代码语言:javascript
运行
复制
if(android_get_device_api_level()>=30)
     android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ONCE);

但是,由于错误,我无法编译:

未声明标识符“android_fdsan_set_error_level”的使用

因为这只是在Android 10 (API 29)中添加的。

所以我的问题是如何在我的项目中调用这个函数?我为此创建了一个特定的cpp文件,并为此创建了一个特定的库,所以我需要一些方法来说明这个库只适用于Android 10或更高版本。在cpp文件或Android.mk文件中是否有一些定义可以用来编译这个特定的库,只有在我的应用程序启动时,我才能从Android11或更高版本中调用这个库?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-21 10:50:44

根据文档这里,您应该这样做:

代码语言:javascript
运行
复制
if (android_fdsan_set_error_level) {
    android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ONCE);
}

您必须将目标SDK设置为10或更高版本才能工作。

或者,如果要将其编译成单独的本机二进制文件,则可以使用条件编译。

包括文件。

然后做这样的事情:

代码语言:javascript
运行
复制
#if __ANDROID_API__ >= __ANDROID_API_P__
    android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ONCE);
#endif

只需确保此二进制文件从未加载到旧设备上,否则链接器将产生错误。

根据构建整个项目的方式,您可能需要在一个包中提供一个单独的APK。

最后,如果所有其他模块都失败了,您可以尝试使用dlopendlsym在运行时动态加载函数,但是您需要知道它到底包含在哪个模块中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69267194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档