无法与系统库链接到供应商二进制文件

时间:2018-10-05 08:27:59

标签: android c

我正在尝试使用供应商分区中存在的二进制文件访问libsparese库,但libsparse库位于系统分区中,在构建过程中会引发以下错误。

  

(native:vendor)不应链接到libsparse   (本地:平台)

如果该库存在于system / lib64 /中,该如何使用?

4 个答案:

答案 0 :(得分:1)

您不得链接非NDK平台库。

https://android.googlesource.com/platform/bionic/+/372f19e9e27c1333c0fc1e83b53d365051e81612/android-changes-for-ndk-developers.md

所示
  

本机库只能使用公共API,并且不得链接到非NDK平台库。从API 24开始,将强制执行此规则,并且应用程序不再能够加载非NDK平台库。该规则由动态链接器强制执行,因此,无论代码尝试加载非公共库如何,都无法访问非公共库:System.loadLibrary,DT_NEEDED条目以及对dlopen(3)的直接调用将完全相同。 / p>

答案 1 :(得分:0)

如果模块依赖于任何系统模块,则可以按照以下步骤将模块链接到系统模块。

示例:- 模块A是供应商平台模块 模块B是系统平台模块 将模块B包含在模块A中后,您将得到以下错误提示。 模块A(本地:供应商)不应链接到模块B(本地:平台) 然后.................. 有一个解决方法。

  1. 在模块A生成文件的“ LOCAL_C_INCLUDES + =“中添加模块B的绝对路径。 LOCAL_C_INCLUDES + = \  / system // include
  2. 是模块B是共享库,然后在模块A的make文件中添加以下内容。 LOCAL_LDFLAGS + = $(呼叫中间体-dir-for,SHARED_LIBRARIES,B)/B.so

  3. 最后,在模块A中为模块B添加其他依赖项 LOCAL_ADDITIONAL_DEPENDENCIES:= B

现在您可以在模块A中使用模块B了。:)

答案 2 :(得分:0)

如果模块依赖于任何系统模块,则可以按照以下步骤将模块链接到系统模块。

示例:-模块A是供应商平台模块模块B是系统平台模块,在将模块B包含在模块A中之后,您将得到以下错误。模块A(本机:供应商)不应链接到模块B(然后……...............对此有一个解决方法。

在模块A生成文件的“ LOCAL_C_INCLUDES + =”中添加模块B的绝对路径。 LOCAL_C_INCLUDES + = \ / system // include

是模块B是共享库,然后在模块A的make文件中添加以下内容。 LOCAL_LDFLAGS + = $(调用中间体-dir-for,SHARED_LIBRARIES,B)/B.so

最后,在模块A LOCAL_ADDITIONAL_DEPENDENCIES中为模块B添加其他依赖项:= B

现在您可以在模块A中使用模块B了。:)

答案 3 :(得分:0)

这只是其他信息。 如果您使用的系统库是根据您自己的代码构建的,则可以通过在List<className> list = new ArrayList<>(); try { BufferedReader br = new BufferedReader(new FileReader("filename")); String line = br.readLine(); while ((line = br.readLine()) != null) { String fields[] = line.split(","); ClassName object = new ClassName(); object.setColumn(fields[column_number]); list.add(object); } } catch (Exception e) { e.printStackTrace(); } Android.mk中添加以下标志来使系统库与供应商兼容。

对于Android.bp

Android.bp

对于vendor_available: true

Android.mk

现在您可以将这些库包含在LOCAL_VENDOR_MODULE := true 中并使用它们。