在将第三方的app设置成系统app时 会在编译Android.mk文件中的LOCAL_PREBUILT_JNI_LIBS是干嘛的?请说出如何配置,以及原理
时间: 2024-02-01 07:14:44 浏览: 139
LOCAL_PREBUILT_JNI_LIBS是Android.mk文件中的一个变量,用于指定要打包到APK中的第三方JNI库的路径和名称。通常,这些库是由第三方的库或应用程序提供的,需要在应用程序中使用它们。
在编译Android.mk文件时,LOCAL_PREBUILT_JNI_LIBS变量会被解析并将指定的库文件复制到APK的lib目录下。当应用程序运行时,系统会自动加载这些库文件,并且可以使用其提供的JNI接口。
配置LOCAL_PREBUILT_JNI_LIBS的方法如下:
1. 在Android.mk文件中添加以下代码:
```
LOCAL_PREBUILT_JNI_LIBS := path/to/library.so
```
其中,path/to/library.so是指定的第三方库文件路径和名称。
2. 将该库文件复制到jni目录下的libs目录中。
3. 在应用程序的Java代码中,使用以下代码加载库文件:
```
static {
System.loadLibrary("library");
}
```
其中,library是指定的库文件名称。
原理是将第三方库文件打包到APK中,然后在应用程序运行时加载这些库文件,从而使用其提供的JNI接口。这种方式可以方便地使用第三方库,并且不需要将其源代码添加到应用程序中。
相关问题
在编译Android.mk文件中的LOCAL_PREBUILT_JNI_LIBS是干嘛的?请说出如何配置,以及原理
LOCAL_PREBUILT_JNI_LIBS是一个Android.mk文件中的变量,用于指定需要打包进APK中的预编译JNI库。在Android应用程序中,我们可能需要使用第三方的C/C++库,而这些库需要与Java代码交互,就需要使用JNI技术。为了使这些库能够在Android应用程序中正常工作,我们需要将它们编译成.so文件,并打包到APK中。
配置方法如下:
```
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libtest
LOCAL_SRC_FILES := libtest.so
LOCAL_PREBUILT_JNI_LIBS := $(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI)/libtest.so
include $(PREBUILT_SHARED_LIBRARY)
```
其中,LOCAL_PREBUILT_JNI_LIBS变量指定了要打包进APK中的预编译JNI库路径。这里的$(TARGET_ARCH_ABI)变量表示当前编译的CPU架构。在libs目录下按照不同的CPU架构分别存放对应的预编译JNI库。这样一来,当我们编译APK时,编译系统会自动将指定的预编译JNI库复制到APK中。
原理:
在编译APK时,编译系统会将所有的资源文件(包括编译得到的.class文件、预编译JNI库、图片等)打包成一个zip文件,即APK包。预编译JNI库通过LOCAL_PREBUILT_JNI_LIBS指定路径,并通过include $(PREBUILT_SHARED_LIBRARY)命令将它们打包到APK中。在安装APK时,系统会将APK解压到设备的/data/app目录下,并将预编译JNI库复制到应用程序的私有目录下。这样,当应用程序启动时,就可以加载并使用预编译JNI库了。
LOCAL_PATH := $(my-dir) include $(CLEAR_VARS) LOCAL_MODULE := dangbei LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_PATH := $(TARGET_OUT_ODM)/bundled_persist-app LOCAL_SRC_FILES := $(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := PRESIGNED LOCAL_DEX_PREOPT := false LOCAL_ENFORCE_USES_LIBRARIES := false LOCAL_MODULE_TAGS := optional LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_JNI_SHARED_LIBRARIES_ABI := arm MY_LOCAL_PREBUILT_JNI_LIBS := \ lib/arm/libeuthenia-lib.so\ lib/arm/libjcore290.so\ MY_APP_LIB_PATH := $(TARGET_OUT_ODM)/bundled_persist-app/$(LOCAL_MODULE)/lib/$(LOCAL_JNI_SHARED_LIBRARIES_ABI) ifneq ($(LOCAL_JNI_SHARED_LIBRARIES_ABI), None) $(warning MY_APP_LIB_PATH=$(MY_APP_LIB_PATH)) LOCAL_POST_INSTALL_CMD := mkdir -p $(MY_APP_LIB_PATH) $(foreach lib, $(MY_LOCAL_PREBUILT_JNI_LIBS), ; cp -f $(LOCAL_PATH)/$(lib) $(MY_APP_LIB_PATH)/$(notdir $(lib))) endif include $(BUILD_PREBUILT)
这是一个 Android.mk 文件,用于编译一个名为 "dangbei" 的应用程序,并将其安装到系统的 "bundled_persist-app" 目录中。该应用程序使用了三个共享库:libeuthenia-lib.so、libjcore290.so 和一个未知的库。在安装应用程序时,这些库将被复制到 "dangbei" 应用程序的 "lib/arm" 目录下。
阅读全文