Android studio 使用Android Studio和Gradle将libxml2构建到NDK中

Android studio 使用Android Studio和Gradle将libxml2构建到NDK中,android-studio,android-ndk,libxml2,static-linking,gradle-experimental,Android Studio,Android Ndk,Libxml2,Static Linking,Gradle Experimental,我的Android项目已经使用Eclipse和ADT进行了几年。该项目使用3个预编译的静态库(curl、ssl和crypto),然后在中编译并静态链接libxml2。Android.mk中的相关行包括: LOCAL_MODULE := my_shim LOCAL_SRC_FILES := $(LOCAL_FILE_LIST:$(LOCAL_PATH)/%=%) LOCAL_CFLAGS := -DCURL_DISABLE_TYPECHECK LOCAL_LDLIBS := -L$(SYSR

我的Android项目已经使用Eclipse和ADT进行了几年。该项目使用3个预编译的静态库(curl、ssl和crypto),然后在中编译并静态链接libxml2。Android.mk中的相关行包括:

LOCAL_MODULE    := my_shim
LOCAL_SRC_FILES := $(LOCAL_FILE_LIST:$(LOCAL_PATH)/%=%)
LOCAL_CFLAGS := -DCURL_DISABLE_TYPECHECK
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lz
LOCAL_SHARED_LIBRARIES :=
LOCAL_STATIC_LIBRARIES += xml2 curl ssl crypto
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../c_module
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../libxml2/include

include $(BUILD_SHARED_LIBRARY)

include $(APP_LOCAL_PATH)/../../libxml2/Android.mk
我现在正在使用Gradle Experimental切换到Android Studio 2,但在正确配置Gradle时遇到了问题。我想我已经成功地整理了对log和z以及静态编译的curl、ssl和crypto库的依赖关系,但是我不知道如何告诉它构建然后静态链接libxml2模块

有什么线索吗?这就是我到目前为止所做的:

model {
    android {
        ...
    }

    android.ndk {
        moduleName "my_shim"
        platformVersion 19
        abiFilters.addAll(["armeabi", "x86"])
        CFlags.add("-DCURL_DISABLE_TYPECHECK")
        ldLibs.addAll(["log", "z"])
        stl "stlport_static"
    }

    android.sources {
        main {
            jni {
                dependencies {
                    library "crypto" linkage "static"
                    library "curl" linkage "static"
                    library "ssl" linkage "static"
                    library "xml2" linkage "static"
                }
            }
        }
    }

    repositories {
        libs(PrebuiltLibraries) {
            crypto {
                binaries.withType(StaticLibraryBinary) {
                    def cryptoLibPath = "src/main/jni/includes/${targetPlatform.getName()}/libcrypto.a"
                    staticLibraryFile = file("${cryptoLibPath}")
                }
            }
        }
        libs(PrebuiltLibraries) {
            curl {
                binaries.withType(StaticLibraryBinary) {
                    def curlLibPath = "src/main/jni/includes/${targetPlatform.getName()}/libcurl.a"
                    staticLibraryFile = file("${curlLibPath}")
                }
            }
        }
        libs(PrebuiltLibraries) {
            ssl {
                binaries.withType(StaticLibraryBinary) {
                    def sslLibPath = "src/main/jni/includes/${targetPlatform.getName()}/libssl.a"
                    staticLibraryFile = file("${sslLibPath}")
                }
            }
        }
    }
}

我认为有两种方法

  • 手动预构建libxml2并将其与其他预构建库放在一起

  • 创建一个依赖项(以及xml2库的单独项目),如前所述


  • 你看过谷歌的hello libs样本了吗。他们很好地演示了这个设置。谢谢@IgorGanapolsky-这个项目提供了比我见过的任何其他项目都多的例子。为什么xml2需要成为一个单独的项目?我认为OP想要的只是一个静态库,可以包含在他的主要项目中……我绝对不想为它单独创建项目,但我还是按照预先构建的方式让它工作。我会看看谷歌的android ndk样本(由@IgorGanapolsky提到),看看我是否能得到我所希望的干净解决方案。干杯。伊戈尔,我建议两种方法。Darren需要把这些图书馆找个地方。和
    hello libs
    提供其中一个。但有时需要动态重建本地库。所以我个人不明白你的意思。