我一直在处理一个需要链接来自其他应用程序的两个共享库的项目,而不是实际将它们包含在最终的包中。我正在使用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.)'
中。
如何成功连接此项目?
答案 0 :(得分:0)
我做了一个解决方法;我的解决方案是将我希望链接的库添加到NDK的系统库目录。
位于ANDROID_NDK/platforms/android-XX/arch-XX/usr/lib/
下方。这似乎工作正常,因为我希望库的处理方式与系统库相同(不包括在预编译中,但仍然链接在一起)。
作为补充,可以将头文件放在include
目录下。