如何在C ++上将C ++运行时静态编译为NDK / JNI库?

时间:2014-09-25 09:34:42

标签: android c++ android-ndk

我想编译一个用C ++编写的库(静态但也可以共享),这样我就可以静态地包含我在库中使用的所有C ++运行时功能,即另一个项目可以简单地包含我的.a或。所以文件,而不必担心进一步的依赖。如何使用NDK / Android构建系统执行此操作?

到目前为止,我有

APP_STL := c++_static

在我的Application.mk中使用

构建我的库
include $(BUILD_STATIC_LIBRARY)
设置项目后,在我的Android.mk中

。但是,如果我然后将生成的库拉入另一个未指定S​​TL的项目(例如,动态库)(例如纯C),我会得到一个符号加载未找到的链接器错误。只有当我指定在第二个项目中使用c ++ _ static STL时,这些错误才会消失,表明c ++ _ static没有被拉入第一个库。 (我知道这并不奇怪,但这不是我想要的行为。)

使用好的'make文件并指定构建标志自己允许我组合静态库。我的问题是哄骗NDK构建系统来做到这一点:)

1 个答案:

答案 0 :(得分:0)

如果您将C ++运行时静态编译到lib,不幸的是另一个项目必须担心这种依赖:

如果多个.so文件正在使用静态C ++运行时,由于共享运行时使用的全局变量,这可能导致损坏和崩溃。

如果将所有内容(您的lib和最终项目)编译为单个.so文件,则可以使用一个静态C ++运行时,如果在最终项目中声明它,则更好。因为强制在lib中静态包含C ++运行库会阻止使用C ++运行时的最终项目。