我有一个应用程序,它使用带有原生库的库,现在在Android 11中,由于fdsan而崩溃。
我已经联系了图书馆的提供者,但是他们不会在这个问题解决后交付一个新版本的库,所以我需要能够以某种方式禁用fdsan。
我认为解决方案是,当我在Android 11或更高版本的时候打电话:
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或更高版本中调用这个库?
发布于 2021-09-21 10:50:44
根据文档这里,您应该这样做:
if (android_fdsan_set_error_level) {
android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ONCE);
}您必须将目标SDK设置为10或更高版本才能工作。
或者,如果要将其编译成单独的本机二进制文件,则可以使用条件编译。
包括这文件。
然后做这样的事情:
#if __ANDROID_API__ >= __ANDROID_API_P__
android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ONCE);
#endif只需确保此二进制文件从未加载到旧设备上,否则链接器将产生错误。
根据构建整个项目的方式,您可能需要在一个包中提供一个单独的APK。
最后,如果所有其他模块都失败了,您可以尝试使用dlopen和dlsym在运行时动态加载函数,但是您需要知道它到底包含在哪个模块中。
https://stackoverflow.com/questions/69267194
复制相似问题