使用 jni 库的 AOSP 构建应用程序

AOSP building application with jni libs

我正在尝试在 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

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

和构建系统折腾了好久,终于找到解决办法,写了一篇小文章,详细介绍了如何构建系统权限的应用程序

How to Build an Android Application with System Privilegies

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

您的应用程序 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
}