java - 如何将第 3 方库添加到 Android AOSP 构建中?

标签 java android makefile android-source

我正在尝试将 Jackson JSON 库添加到我的 AOSP 项目中。我能够编译我的项目并将其闪存到手机上,但出现运行时错误:

E/JavaBinder( 1689): java.lang.NoClassDefFoundError: Failed resolution of: Lcom/fasterxml/jackson/core/JsonFactory;
...
E/JavaBinder( 1689): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.fasterxml.jackson.core.JsonFactory" on path: DexPathList[[zip file "/system/framework/guice.jar", zip file "/system/framework/beanshell.jar", zip file "/system/framework/services.jar", zip file "/system/framework/ethernet-service.jar", zip file "/system/framework/wifi-service.jar"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]

我已经尝试从源代码和 jar 中包含 Jackson。这是我的 Android.mk 文件:


源代码 Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under,.)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE:= com.fasterxml.jackson.core
include $(BUILD_JAVA_LIBRARY)

# Copy XML to /system/etc/permissions/
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := com.fasterxml.jackson.core.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)

SOURCE com.fasterxml.jackson.core.xml(以上引用)

<?xml version="1.0" encoding="utf-8"?>
<permissions>
    <library name="com.fasterxml.jackson.core.xml"
        file="/system/framework/com.fasterxml.jackson.jar" />
</permissions>

JAR Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jackson
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := jackson-core-2.5.0.jar
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX)
include $(BUILD_PREBUILT)

我还在 Android.mk 文件的 LOCAL_JAVA_LIBRARIES := 部分添加了一个 jackson 条目,我想在其中使用 Jackson (frameworks/base/服务)。无论我尝试了什么,我都会得到一个 ClassNotFoundException

我错过了什么?我有没有做过不必要的事情?

最佳答案

要包含来自源的第 3 方库:

  1. 将库的源代码复制到 $ANDROID_BUILD_TOP/external/ 下的目录中(例如:$ANDROID_BUILD_TOP/external/jackson)
  2. 创建一个 Android.mk 文件,并将其放在库的文件夹中(例如:$ANDROID_BUILD_TOP/external/jackson/Android.mk

    Android.mk的内容:

    # required (setup the build environment)
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    
    # optional step to automate some pre-compilation steps for this library
    # run `mvn generate-sources` before we compile
    $(info $(shell (mvn generate-sources -f $(LOCAL_PATH)/pom.xml)))
    
    # required (the name of the library we are building)
    LOCAL_MODULE := jackson
    
    # required (paths to all directories that include source code)
    # note the difference between the := (first line) and += (every other line)
    LOCAL_SRC_FILES := $(call all-java-files-under, src/main)
    LOCAL_SRC_FILES += $(call all-java-files-under, target/generated-sources)
    
    # required (tell the build system what kind of thing we are building)
    include $(BUILD_JAVA_LIBRARY)
    
  3. 将库添加到 mk 文件的 PRODUCT_BOOT_JARS 部分。您编辑哪个文件取决于您正在构建什么(例如:build/target/product/core_minimal.mk)

    原创

    PRODUCT_BOOT_JARS := \
        okhttp \
        core-junit \
        bouncycastle \
        ext \
        gson
    

    已修改

    PRODUCT_BOOT_JARS := \
        okhttp \
        core-junit \
        bouncycastle \
        ext \
        gson \
        jackson
    
  4. 对于您的 AOSP 项目(例如:frameworks/base)的每个子模块您希望访问该库,找到 makefile(例如:$ANDROID_BUILD_TOP/frameworks/base/Android.mk 并将您的库的条目添加到 LOCAL_JAVA_LIBRARIES 行。示例:

    原创

    LOCAL_JAVA_LIBRARIES := guice gson
    

    已修改

    LOCAL_JAVA_LIBRARIES := guice gson jackson
    
  5. 编译您的项目。

关于java - 如何将第 3 方库添加到 Android AOSP 构建中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32186980/

相关文章:

makefile - 通过读取另一个文件的内容在 makefile 中创建变量

c++11 - make 没有为 g++ 使用 -std=c++11 选项

java - 尽情玩耍! 2.0框架

java - 如何在 Java 中修剪字符串

C# ecdsa 签名 - 我可以选择哪种 key 规范?

java - 如果刷新 token 被撤销,则从应用程序中注销用户

java - Android Studio : Adding a new java file to an existing package - "Unresolved Reference"

android - 如何使用 gradle 和 proguard printmapping 创建带有版本代码的 out.map 文件

Android 9-patch 图片

linux - 如何让 gcc 跳过错误,但仍然输出它们。