如何将第三方库添加到Android AOSP构建中?

我正在尝试将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 (上面引用)

     

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) 

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

我错过了什么? 我做了什么不必要的事吗?

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

  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. 编译您的项目。