源码编译引入第三方库

2024-05-09 23:33
文章标签 源码 编译 第三方 引入

本文主要是介绍源码编译引入第三方库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 发现问题

在Android工程开发中难免会有引入第三方库的需求,例如GSON,Okhttp,Glide等等,但是在源码中用makefile编译如何让编译器知道你引入的库呢?下面我举一个例子来说明

  • 例如我们工程需要引入GSON库,没引入的时候编译报错如下图。
    编译报错.png

  • 引入库制定编译规则
    依赖库问题.png

2. 寻找原因

原因的话编译器已经报出来了,就是找不到对应的类,也就是找不到对应的库文件。

3. 解决办法(引入第三方库方法)

在解决问题之前首先介绍一下这两个编译参数:BUILD_JAVA_LIBRARY 与 BUILD_STATIC_JAVA_LIBRARY

在Android.mk中可通过调用include $(BUILD_JAVA_LIBRARY)和include $(BUILD_STATIC_JAVA_LIBRARY)来分别生成目标设备上的共享JAVA库与静态JAVA库。二者的区别在于**静态JAVA库是由.class文件打包而成JAR包,它在任何一个JAVA虚拟机上都可以运行**;而**共享JAVA库则是在静态库的基础上进一步打包成的.dex文件**,众所周知,dex是在android系统上所使用的文件格式。由以上结论可做出进一步的推论:即Android.mk中变量LOCAL_JAVA_LIBRARIES所指定的为android系统使用的dex类库;而LOCAL_STATIC_JAVA_LIBRARIES变量所指定的则是.class文件打包而成的JAR文件:即静态JAVA库。**BUILD_STATIC_JAVA_LIBRARY**会生成out/target/common/obj/JAVA_LIBRARIES/lib名_intermediates目录及其下的JAR文件;而**BUILD_JAVA_LIBRARY**生成此目录的同时会将其中的JAR包复制到out/target/product/<product-name>/system/framework/中;除此之外,还存在**BUILD_HOST_JAVA_LIBRARY**命令则是在out/host/linux-x86/framework目录下生成相应的JAR包。分别使用此三条命令执行的结果如下所示:注意其中带有红色下划线的LOG信息。
#编译第三方库基本用法
#在Android.mk目录下建立libs,然后将jar包放入libs,先预编译到out/target/product/generic/obj/JAVA_LIBRARIES下,然后本项目就会找到依赖的者jar包了
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := gson:libs/gson-2.8.2.jar
include $(BUILD_MULTI_PREBUILT)
#################以下是顺带的说明########################
#################完整的mk文件###########################
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)LOCAL_PACKAGE_NAME := Permission
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := platform#LOCAL_SDK_VERSION 和LOCAL_PRIVATE_PLATFORM_APIS在Android.mk中必须用一个
#LOCAL_SDK_VERSION := current  意思是编译时忽略系统隐藏类(@hide)
#LOCAL_PRIVATE_PLATFORM_APIS := true 表示可以应用系统的API(@hide或者@SystemApi)
LOCAL_PRIVATE_PLATFORM_APIS := true#关闭混淆优化器,没有这个配置,会报:
#there were 194 unresolved references to program class members.Your input classes appear to be inconsistent.
#there were 2494 unresolved references to library class members. You probably need to update the library versions. Alternatively, you may have to specify the option 
LOCAL_PROGUARD_ENABLED := disabledLOCAL_SRC_FILES := $(call all-java-files-under, src)
#编译aidl文件
LOCAL_SRC_FILES += $(call all-Iaidl-files-under,src/com/xh/permission) \src/com/xh/permission/ICarPermissionManager.aidlLOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/src/com/xh/permission#应用第三方库
LOCAL_STATIC_JAVA_LIBRARIES := gson \android-support-v7-appcompat \xhframeworkLOCAL_STATIC_ANDROID_LIBRARIES := android-support-annotations
include $(BUILD_PACKAGE)################我是分割线#####################
LOCAL_STATIC_JAVA_LIBRARIES := gson
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := gson:libs/gson-2.8.2.jar
include $(BUILD_MULTI_PREBUILT)

4.扩展点

如果在Android FrameWork集成第三方SDK的jar包和so库,首先在framework/opt/建立XXXSDK的文件夹讲jar包和so库拷贝进去。

framework依赖库编译.png

###################### mk文件如下 ################################
# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.LOCAL_PATH := $(my-dir)include $(CLEAR_VARS)LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := okhttp-3.12.0.jar \rxjava-2.1.12.jar \sqlite.jarinclude $(BUILD_MULTI_PREBUILT)##################################################
include $(CLEAR_VARS)
LOCAL_MODULE := libcarlife
LOCAL_SRC_FILES := libs/libcarlife.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIESinclude $(BUILD_PREBUILT)include $(call all-makefiles-under,$(LOCAL_PATH))##################################################
include $(CLEAR_VARS)
LOCAL_MODULE := libcarlifeserver
LOCAL_SRC_FILES := libs/libcarlifeserver.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIESinclude $(BUILD_PREBUILT)include $(call all-makefiles-under,$(LOCAL_PATH))##################################################
include $(CLEAR_VARS)
LOCAL_MODULE := libcarlifeservicejni
LOCAL_SRC_FILES := libs/libcarlifeservicejni.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIESinclude $(BUILD_PREBUILT)include $(call all-makefiles-under,$(LOCAL_PATH))##################################################
include $(CLEAR_VARS)
LOCAL_MODULE := libcarlifevehicle
LOCAL_SRC_FILES := libs/libcarlifevehicle.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIESinclude $(BUILD_PREBUILT)include $(call all-makefiles-under,$(LOCAL_PATH))

这篇关于源码编译引入第三方库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974802

相关文章

YOLOv3配置文件源码详解

YOLOv3的配置文件,其中需要注意的是数据增强的方式,有两个,一个是 角度旋转+饱和度+曝光量+色调,外加jitter,随即调整宽高比的范围。之后需要注意的就是 3个尺度的box的mask。后续要知道他们是怎么整合起来的 [net]# Testing# batch=1# subdivisions=1# Trainingbatch=64 #训练样本样本数subdivisions=1

Eclipse Building Workspace 编译慢 解决办法

在svn下载的项目都会一般都会有一个 .project 的文件,在导入项目前将改文件中的一些验证属性删除掉 去掉Validator 相关的,  如: <buildCommand> <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>                <arguments>

Sping 源码深度解析——容器的功能扩展 【学习笔记】

我为什么 看的不够远,因为高度不够! 学习和整理总结Spring容器的功能扩展,本文为学习笔记,其中有一些内容是自己的思考总结! 一、两种Spring中bean加载的方式 第一种 # 第一种使用 BeanFactory 以及它默认的实现类 XmlBeanFactoryBeanFactory bf = new XmlBeanFactory(new ClassPathResource(

Openwrt:编译固件提示[mktplinkfw] error: images are too big 错误

在编译mr3420的固件时,添加了luci、jamvm,但是最终编译的固件“openwrt-ar71xx-generic-tl-mr3420-v1-squashfs-factory.bin”的大小仅仅只有3.1MB,为何会如此小巧,心生疑惑下把该固件烧录到路由中,发现luci和java虚拟机都没有添加上去,然后才发现是固件生成失败了。提示如下: /bin/ar71xx/openwrt-ar71

u-boot 源码分析(1) 启动过程分析

u-boot 源码分析(1) 启动过程分析 文章目录 u-boot 源码分析(1) 启动过程分析前言配置源码结构apiarchboardcommoncmddriversfs Kbuild启动过程第一阶段start.Scrt0_64.S 第二阶段board_f.cboard_r.c 总结参考 前言 对于uboot,我一直是云里雾里的一个状态,这部分让我感到自己很菜,不用纵向深

Linux内核驱动学习(二)添加自定义菜单到内核源码menuconfig

文章目录 目标drivers/Kconfigdemo下的Kconfig 和 MakefileKconfigMakefiledemo_gpio.c 目标 Kernel:Linux 4.4 我编写一个简单的hello worldLinux 内核模块后,已经可以通过insmod动态加载到系统内核中,并通过rmmod卸载模块。但是出于学习的目的,我想把这个内核添加到Linux源码中

关于二维码zxing的及core文件编译的《感受》

由于项目要使用二维码的扫描,于是我开始了二维码之旅。说说我的感受吧 第一天:我首先在网上找到这篇很火的文章   android 条码识别软件开发全解析(续2详解绝杀!)  先说说我从这篇文章中实践的结果是什么? 主要困难在第二步的时候在设置build.properties这里面的两个路径proguard-jar,android-home的时候,我错误的认为例如android-home=D:\\P

linux ndk编译搭建测试

一、ndk下载 NDK 下载  |  Android NDK  |  Android Developers 二、ndk环境变量配置 ndk解压: unzip android-ndk-r26d-linux.zip  环境变量配置:  export NDK_HOME=/rd/own/test/android-ndk-r26d/  export PATH=$PATH:$NDK_HOME

Eclipse下WEB-INF/classes目录下没生成编译最新class文件

右击项目 >> Properties >>Deployment Assembly >>Source 把/src/main/java 的Deploy Path 改为 WEB-INF/classes

Win端交叉编译鸿蒙Ohos Native层第三方库流程

1. 概述 鸿蒙端SDK开发需要依赖使用到的三方库(如OpenCV、其他C++库等),以下为Windows端交叉编译Ohos端三方库流程 2. 准备工作 与Android NDK交叉编译相类似,我们首先需要下载OpenHarmony NDK(包含在OpenHarmony SDK中),这里笔者使用IDE中自带NDK进行操作。 DevEco Studio下载地址: https://develo