如何在不包含在最终包中的情况下链接到共享库?

时间:2016-08-28 06:55:49

标签: android c++ android-ndk android-gradle shared-libraries

我一直在处理一个需要链接来自其他应用程序的两个共享库的项目,而不是实际将它们包含在最终的包中。我正在使用Android Studio执行外部ndk-build的常用方法,但我现在正在使用实验性gradle NDK支持。

根据我对信息here的理解,使用jniLibs源集将二进制文件打包到最终应用程序,这不是我想要的。我想在编译期间链接库,并期望我自己的模块在可用的环境中加载。

我的旧解决方法是在Android.mk中添加以下行:TARGET_NO_UNDEFINED_LDFLAGS :=,但我不知道任何与新NDK支持等效的方法。

目前,我将jni目录包含在我的源代码中,将-L"<directory>"添加到ldFlags,并将其与系统库链接,如下所示(目前,我只为ARMv7构建):

android.ndk {
    moduleName = "ropecraftpe"
    ldLibs.addAll(['log', 'name of one library', 'name of other library'])
    ldFlags.add('-L"' + file('src/main/jni').absolutePath + '"')

    cppFlags.add('-std=c++11')
    stl = 'gnustl_shared'
    abiFilters.addAll(['armeabi-v7a'])
}

这大部分都有效 - 奇怪的是,链接器不会抱怨对静态函数或全局变量的调用,但是当尝试使用其中一个库中定义的构造函数时,抱怨:{ {1}}。这个类是在我自己的C ++代码中包含的头文件中定义的,构造函数肯定存在于链接的Error:(12) undefined reference to 'ClassName::ClassName(std::string const&, etc.)'中。

如何成功连接此项目?

1 个答案:

答案 0 :(得分:0)

我做了一个解决方法;我的解决方案是将我希望链接的库添加到NDK的系统库目录。

位于ANDROID_NDK/platforms/android-XX/arch-XX/usr/lib/下方。这似乎工作正常,因为我希望库的处理方式与系统库相同(不包括在预编译中,但仍然链接在一起)。

作为补充,可以将头文件放在include目录下。