AOSP 使用 jni 库构建应用程序

Posted

技术标签:

【中文标题】AOSP 使用 jni 库构建应用程序【英文标题】:AOSP building application with jni libs 【发布时间】:2021-01-14 11:27:06 【问题描述】:

我正在尝试在 AOSP 中构建一个 android 应用程序。

我已经将Android.bp文件定义如下

cc_prebuilt_library_shared 
    name: "libPrintString",
    target: 
        android_arm: 
            srcs: ["lib/libPrintString.so"],
        ,
        android_arm64: 
            srcs: ["lib64/libPrintString.so"],
        ,
    ,
    strip:  none:true, ,


java_import 
    name: "stringutils",
    jars: ["libs/stringutils.jar"],


android_app 
    name: "HelloWorld",
    srcs: ["src/**/*.java",],
    platform_apis: true,
    product_specific: true,
    certificate: "platform",
    privileged: true,
    static_libs: [
        "com.google.android.material_material",
        "androidx-constraintlayout_constraintlayout",
        "stringutils",
    ],
    jni_libs: ["libPrintString"]


我已将我的应用程序放在/packages/apps 文件夹中,该项目具有以下结构

+ HelloWorld
  - Android.bp
  - AndroidManifest.xml
  + lib
    - libPrintString.so
  + lib64
    - libPrintString.so
  + libs
    - stringutils.jar
  + res
  + src

当我调用 make 时出现错误

FAILED: ninja: 'out/target/product/mydroid/product/lib64/libPrintString.so', needed by 'out/target/product/mydroid/product.img', missing and no known rule to make it

有人可以帮我找到解决方案吗?

【问题讨论】:

【参考方案1】:

您的应用程序HelloWorld 定义具有此属性product_specific: true,这意味着应用程序将转到/product 分区并将搜索/product/lib*/ 中的库。 但是您的库libPrintString 定义没有product_specific: true,这意味着库转到system/lib*/

所以错误是有道理的。

要解决您的问题,您必须将此属性 product_specific: true 添加到您的库定义中。

cc_prebuilt_library_shared 
    name: "libPrintString",
    target: 
        android_arm: 
            srcs: ["lib/libPrintString.so"],
        ,
        android_arm64: 
            srcs: ["lib64/libPrintString.so"],
        ,
    ,
    strip:  none:true, ,
    product_specific: true

【讨论】:

【参考方案2】:

和构建系统打了半天,终于找到了解决办法,写了一篇小文章详细描述了如何构建具有系统权限的应用

How to Build an Android Application with System Privilegies

我仍然不完全明白为什么一开始它不能正常工作,很可能是因为我的构建系统没有清理旧库,但现在一切正常。

【讨论】:

在提到文章中我没有看到有问题使用的Android.bp。因此,您似乎使用另一种方法(Android.mk build)来解决给定的问题,这意味着使用Android.bp 用于此类目的的问题仍然存在,对吗? 啊,是的,你是对的,我没有尝试使用 .bp 文件,我会这样做,看看是否可行,@NikolayKhilyuk 感谢您的反馈。

以上是关于AOSP 使用 jni 库构建应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何将“aar”库添加到 AOSP?

如何在 AOSP 源代码中添加预构建的应用程序(系统应用程序)

如何在 AOSP 构建中设置默认启动器?

当从属共享库包含符号时 ,Java JNI“符号查找错误”

将外部JAR添加到Android AOSP构建时出错

使用与Android库提供的/ compileOnly依赖项