在项目开发中有时候会用到第三方库,但是在Android编译系统中不能像Linux那样直接在Makefile链接某个so,Android所有的库都需要在out/target/product/项目/obj/lib/生成,所有我们可以采用Android 的预编译BUILD_PREBUILT将第三方库编译到out/target/product/项目/obj/lib/中,于是有以下的Android.mk

#1.预编译第三方库liba.soLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS) #要生成的库LOCAL_MODULE := liba #默认选项LOCAL_MODULE_TAGS := optional#所属的类是动态库LOCAL_MODULE_CLASS := SHARED_LIBRARIES #这个是生成的后缀,我在hisi上面是可以不用加这个的,但是高通上面必须要加这个,不然编译的出来的库不带soLOCAL_MODULE_SUFFIX := .so #这个是第三方的库LOCAL_SRC_FILES := armeabi-v7a/liba.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)include $(BUILD_PREBUILT)#2.使用该库include $(CLEAR_VARS)LOCAL_MODULE := libmaintestLOCAL_SRC_FILES := main.cLOCAL_C_INCLUDES := $(LOCAL_PATH)#链接上面预编译的共享库LOCAL_SHARED_LIBRARIES := libainclude $(BUILD_SHARED_LIBRARY)

 

上面的Android.mk程序在hisi3798MV200上是可以编译通过的,因为他编译出来的so全部都是32位的,但是在高通msm8953上死活都编译不过

ninja: Entering directory `.'
ninja: error: 'out/target/product/msm8953_64/obj_arm/SHARED_LIBRARIES/liba_intermediates/export_includes', needed by 'out/target/product/msm8953_64/obj_arm/SHARED_LIBRARIES/libmaintest_intermediates/import_includes', missing and no known rule to make it
build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed
 

这就尴尬了,看上面的log,预编译第三方库liba.so根本就没有编译,于是我把include $(BUILD_SHARED_LIBRARY)注释掉,发现预编译的第三方库又能编译,这就奇怪了,网上找了好多资料,找到好多关于预编译编译第三方库Android.mk,依旧还是无效,于是在高通的SDK中mgrep -nR "LOCAL_MODULE_CLASS := SHARED_LIBRARIES "找到了高通关于编译第三方so的Android.mk

ifeq ($(TARGET_BUILD_PDK),true)ifeq ($(TARGET_BOARD_PLATFORM),msm8996)#----------------------------------------------------------------------# Fixup libandroid dependency#----------------------------------------------------------------------LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := libandroidLOCAL_MODULE_SUFFIX := .so LOCAL_MODULE_CLASS := SHARED_LIBRARIES                                                                                                                                                       LOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES_arm := ../../../../$(PRODUCT_OUT)/obj/PACKAGING/pdk_fusion_intermediates/system/lib/libandroid.soLOCAL_SRC_FILES_arm64 := ../../../../$(PRODUCT_OUT)/obj/PACKAGING/pdk_fusion_intermediates/system/lib64/libandroid.soLOCAL_MULTILIB := bothinclude $(BUILD_PREBUILT)$(LOCAL_PATH)/../../../../out/target/product/msm8996/obj/PACKAGING/pdk_fusion_intermediates/system/lib/libandroid.so : $(PRODUCT_OUT)/obj/PACKAGING/pdk_fusion_intermediates/pdk_fusion.stamp$(LOCAL_PATH)/../../../../out/target/product/msm8996/obj/PACKAGING/pdk_fusion_intermediates/system/lib64/libandroid.so : $(PRODUCT_OUT)/obj/PACKAGING/pdk_fusion_intermediates/pdk_fusion.stampendifendif

于是有以下修改

​#1.预编译第三方库liba.soLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS) #要生成的库LOCAL_MODULE := liba #默认选项LOCAL_MODULE_TAGS := optional#所属的类是动态库LOCAL_MODULE_CLASS := SHARED_LIBRARIES #这个是生成的后缀,我在hisi上面是可以不用加这个的,但是高通上面必须要加这个,不然编译的出来的库不带soLOCAL_MODULE_SUFFIX := .so #这个是第三方的库,我这里是添加了一个32位的库和64位的库LOCAL_SRC_FILES_arm:= arm64-v8a/liba.soLOCAL_SRC_FILES_arm64:= armeabi-v7a/liba.so#32位、64位两者都编译LOCAL_MULTILIB := both LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)include $(BUILD_PREBUILT)#2.使用该库include $(CLEAR_VARS)LOCAL_MODULE := libmaintestLOCAL_SRC_FILES := main.cLOCAL_C_INCLUDES := $(LOCAL_PATH)#链接上面预编译的共享库LOCAL_SHARED_LIBRARIES := libainclude $(BUILD_SHARED_LIBRARY)​

这么一修改之后就可以编译通过了,我猜测是我再高通的平台是64位的,但是也会用到32位的,所以就需要声明

LOCAL_SRC_FILES_arm:= arm64-v8a/liba.so
LOCAL_SRC_FILES_arm64:= armeabi-v7a/liba.so,并且声明LOCAL_MULTILIB := both 两个都编译

海思3798MV200是单32位,所以就按照第一个版本的Android.mk也能编译通过

更多相关文章

  1. 【源码分享下载】每日更新之Android项目源码---手机天气预报系统
  2. 2019最新Android常用开源库总结(附带github链接)
  3. Canonical 宣布 Ubuntu for Android 项目
  4. Android Studio中新建项目时Your android sdk is out of date or
  5. 索引:Android Studio安装及工程项目目录简介
  6. 【开源项目3】Android快速开源框架--afinal
  7. android的一些开源项目

随机推荐

  1. Android中android:visibility的3中属性的
  2. Android多媒体播放器源码解析(stagefrigh
  3. Android(安卓)TextUtils类介绍
  4. Android(安卓)实现json网络数据通过BaseA
  5. AES加解密算法在Android中的应用及Androi
  6. android背景选择器selector用法汇总
  7. android添加广告之--有米
  8. 如何改变Android(安卓)Progressbar默认颜
  9. android常用布局
  10. Android开发环境搭配