如何在Android cmake外部构建系统中链接第三方库?

14

Android Studio 2.2引入了cmake外部构建系统。问题在于文档真的缺乏,我不知道应该如何链接第三方库? 我尝试了cmake指令target_link_libraries:

target_link_libraries(native-lib libs/libSomething.so)

它“工作”了,因为应用程序编译了,但是在运行时我得到了dlopen错误,因为libSomething.so没有与应用程序一起打包。如果更改了libs目录,则该目录位于“app”下,并且我是使用由Android Studio 2.2生成的默认JNI项目启动的...

[更新]

我已经尝试将libSomething.so放在app/src/main/jniLibs/armeabi-v7a下,但现在“main”(native-lib)库未打包。

[更新2]

我添加了源设置配置,包括cmake输出目录,这可以工作,但非常丑陋,并不是一个永久解决方案...

sourceSet
{
    main
    {
        jniLibs.srcDirs = [ "libs", ".externalNativeBuild/cmake/debug/obj"]
    }
}
2个回答

17

目前我最终选择在构建后步骤中将libSomething.so复制到cmake库输出目录中。这可以起作用,因为Android Studio会将该目录中的所有内容复制到apk中。

cmake中的命令如下:

add_custom_command(TARGET native-lib POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy
        ${CMAKE_CURRENT_SOURCE_DIR}/libs/${ANDROID_ABI}/libSomething.so
        ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libSomething.so
    )

3
目前,您可以将共享库放入目录中,并配置jniLibs指向该目录,这样就可以打包它。以下是一个示例:https://github.com/googlesamples/android-ndk/tree/master/hello-libs,请遵循gperf看看是否有帮助。这样做可以避免应用程序依赖于生成的构建文件夹。当Android Studio添加打包库时,jniLibs的解决方法不再必要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接