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 库构建应用程序的主要内容,如果未能解决你的问题,请参考以下文章