源码编译引入第三方库

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

相关文章

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

java对接第三方接口的三种实现方式

《java对接第三方接口的三种实现方式》:本文主要介绍java对接第三方接口的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录HttpURLConnection调用方法CloseableHttpClient调用RestTemplate调用总结在日常工作

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

CSS引入方式和选择符的讲解和运用小结

《CSS引入方式和选择符的讲解和运用小结》CSS即层叠样式表,是一种用于描述网页文档(如HTML或XML)外观和格式的样式表语言,它主要用于将网页内容的呈现(外观)和结构(内容)分离,从而实现... 目录一、前言二、css 是什么三、CSS 引入方式1、行内样式2、内部样式表3、链入外部样式表四、CSS 选

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思