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