Android.mk添加第三方jar包

本文介绍如何在Android项目中引入多个第三方jar包,并详细解释了Android.mk文件中配置项的作用,包括设置签名证书。

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_STATIC_JAVA_LIBRARIES := xsocket jackson-mapper logging jackson-core javatar log4j

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := test


LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)

##################################################
include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := xsocket:lib/xSocket-2.8.14.jar \
    jackson-mapper:lib/jackson-mapper-asl-1.6.2.jar \
    logging:lib/commons-logging.jar \
    jackson-core:lib/jackson-core-asl-1.6.2.jar \
    javatar:lib/javatar-2.5.jar \
    log4j:lib/log4j-1.2.15.jar

include $(BUILD_MULTI_PREBUILT)

# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))

 

以上是我的一个项目中所需要的第三方jar包,主要参考了Android源码中的Calculator应用,该应用也引用了一个第三方的jar包arity-2.1.2.jar。

需要注意的是,当你要引用的jar包不止一个时,有两个关键的地方需要注意的。

LOCAL_STATIC_JAVA_LIBRARIES := xsocket jackson-mapper logging jackson-core javatar log4j

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := xsocket:lib/xSocket-2.8.14.jar \
    jackson-mapper:lib/jackson-mapper-asl-1.6.2.jar \
    logging:lib/commons-logging.jar \
    jackson-core:lib/jackson-core-asl-1.6.2.jar \
    javatar:lib/javatar-2.5.jar \
    log4j:lib/log4j-1.2.15.jar

xsocket jackson-mapper logging jackson-core javatar log4j这几个只是名字,可以随便取。LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES后面才是真正其作用的地方。如:

xsocket:lib/xSocket-2.8.14.jar 引用的是lib目录中的xSocket-2.8.14.jar。

还要注意的是 := 不要写成了+=了哦。

 

附:编写各种类型的Android.mk,出处我忘记了,是以前浏览是拷贝下来的。如果侵犯了作者的权益,烦请联系我hopetribe@gmail.com。我及时删除。

 

一、编译一个简单的APK

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Name of the APK to build
LOCAL_PACKAGE_NAME := LocalPackage
# Tell it to build an APK
include $(BUILD_PACKAGE)

二、编译一个依赖静态.jar文件的APK

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# List of static libraries to include in the package
LOCAL_STATIC_JAVA_LIBRARIES := static-library
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Name of the APK to build
LOCAL_PACKAGE_NAME := LocalPackage
# Tell it to build an APK
include $(BUILD_PACKAGE)
注:LOCAL_STATIC_JAVA_LIBRARIES 后面应是你的APK程序所需要的JAVA库的JAR文件名。

三、编译一个需要platform key签名的APK

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Name of the APK to build
LOCAL_PACKAGE_NAME := LocalPackage
LOCAL_CERTIFICATE := platform
# Tell it to build an APK
include $(BUILD_PACKAGE)
注:LOCAL_CERTIFICATE 后面应该是签名文件的文件名

四、编译一个需要特殊vendor key签名的APK

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Name of the APK to build
LOCAL_PACKAGE_NAME := LocalPackage
LOCAL_CERTIFICATE := vendor/example/certs/app
# Tell it to build an APK
include $(BUILD_PACKAGE)

五、装载一个普通的第三方APK

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed.
LOCAL_MODULE := LocalModuleName
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)

六、装载需要.so(动态库)的第三方apk

LOCAL_PATH := $(my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := baiduinput_android_v1.1_1000e
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)

#################################################################
####### copy the library to /system/lib #########################
#################################################################
include $(CLEAR_VARS)
LOCAL_MODULE := libinputcore.so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
LOCAL_SRC_FILES := lib/$(LOCAL_MODULE)
OVERRIDE_BUILD_MODULE_PATH := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)
include $(BUILD_PREBUILT)

七、编译一个静态java库

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Any libraries that this library depends on
LOCAL_JAVA_LIBRARIES := android.test.runner
# The name of the jar file to create
LOCAL_MODULE := sample
# Build a static jar file.
include $(BUILD_STATIC_JAVA_LIBRARY)
注:LOCAL_JAVA_LIBRARIES表示生成的java库的jar文件名。

<think> 我们讨论了在Android构建系统中声明预编译Java库的方法,用户现在明确询问在Android.mk文件中引用预编译jar的方法。根据之前的引用和回答,我们可以总结如下: 在Android.mk引用预编译jar,需要定义一个预编译模块。关键点括: 1. 使用`LOCAL_MODULE_CLASS := JAVA_LIBRARIES`指定模块类型 2. `LOCAL_MODULE`指定模块名(通常与jar同名,但不需要带后缀) 3. `LOCAL_SRC_FILES`指定jar文件名(需要带后缀) 4. 使用`include $(BUILD_PREBUILT)`来构建预编译模块 具体步骤: 1. 设置LOCAL_PATH 2. 清除旧变量(include $(CLEAR_VARS)) 3. 设置模块类为JAVA_LIBRARIES 4. 指定模块名和源文件(jar) 5. 设置其他属性(如TAGS等) 6. 含预编译构建模板 示例代码(根据引用[1][3]整理): ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 指定模块类型为Java库 LOCAL_MODULE_CLASS := JAVA_LIBRARIES # 模块名(不带后缀),例如:com.fingerprints.extension LOCAL_MODULE := com.fingerprints.extension # 指定jar文件名(带后缀),该文件应放在LOCAL_PATH目录下 LOCAL_SRC_FILES := $(LOCAL_MODULE).jar # 标记为可选模块 LOCAL_MODULE_TAGS := optional # 使用预编译构建 include $(BUILD_PREBUILT) ``` 注意: - 确保jar文件放在与Android.mk相同的目录(或通过路径指定),如引用[2]提到,通常放在与mk文件同级目录。 - 如果需要在系统中含此模块,在设备mk文件中添加:`PRODUCT_PACKAGES += com.fingerprints.extension`(引用[3]提到)。 引用[3]还提到,预编译模块可以解决复制文件无法建立依赖关系的问题,并且对于需要系统签名的jar,这种方法更合适。 如果是在应用中使用预编译jar(而非系统级),可以直接在应用的Android.mk中通过LOCAL_STATIC_JAVA_LIBRARIES或LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES引用(但注意前者用于源码编译,后者用于预编译)。不过,用户问题明确是引用预编译jar,所以我们主要关注预编译模块的声明。 另外,引用[4]提到在Android.bp中的类似做法,但用户询问的是Android.mk,因此我们集中在mk文件上。 相关问题生成: 1. 如何在Android.mk引用第三方jar(非预编译)? 2. 预编译jar和动态jarAndroid构建中的区别? 3. 如何解决预编译jar在编译时的依赖问题? </think> ### 在 Android.mk引用预编译 JAR 的方法 #### 1. **基本声明结构** ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 关键声明:指定为 Java 库类型 LOCAL_MODULE_CLASS := JAVA_LIBRARIES # 必须声明为 JAVA_LIBRARIES[^1][^3] # 模块名称(不含.jar后缀) LOCAL_MODULE := com.fingerprints.extension # JAR 文件名(带后缀) LOCAL_SRC_FILES := $(LOCAL_MODULE).jar LOCAL_MODULE_TAGS := optional # 关键步骤:使用预编译模板 include $(BUILD_PREBUILT) ``` #### 2. **文件路径配置** - JAR 文件必须放置在 **`LOCAL_PATH` 目录**下[^2] - 目录结构示例: ``` project_root/ ├── prebuilts/ │ ├── com.fingerprints.extension.jar # JAR文件 │ └── Android.mk # 声明文件 ``` #### 3. **依赖关系处理** 在依赖该 JAR 的模块中声明: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # ... 其他配置 ... # 添加预编译 JAR 依赖 LOCAL_STATIC_JAVA_LIBRARIES := com.fingerprints.extension # ... 其他配置 ... include $(BUILD_PACKAGE) # 或 BUILD_JAVA_LIBRARY ``` #### 4. **系统级集成** 在设备 Makefile 中添加到系统镜像: ```makefile # device/vendor/product/product.mk PRODUCT_PACKAGES += \ com.fingerprints.extension # 模块名称需匹配[^3] ``` #### 5. **常见问题解决 **问题:`unexpected LOCAL_MODULE_CLASS` 错误** ```makefile # 错误示例 ↓ LOCAL_MODULE_CLASS := APPS # 正确修正 ↓ LOCAL_MODULE_CLASS := JAVA_LIBRARIES # 必须为JAVA_LIBRARIES[^1][^3] ``` **问题:JAR 未被正确打** ```makefile # 在设备配置文件中添加 PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/com.fingerprints.extension.jar:system/framework/com.fingerprints.extension.jar ``` > **最佳实践**: > 1. 保持 `LOCAL_MODULE` 名称与 JAR 文件名一致(不含后缀)[^2] > 2. 系统级 JAR 应放在 `system/framework/` 目录 > 3. 使用 `mm` 命令单独编译验证模块: > ```bash > cd path/to/module > mm > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值