首页 > 解决方案 > 为什么相同的 C++ 库在静态构建中的大小比共享构建小得多,而静态在共享工作时不起作用?

问题描述

当我尝试在 Android Studio 项目中使用 C++ 库时遇到问题。

我正在为 Android 使用静态构建的 Qt 5.14.2。我有Qt 库项目,它只有 1 个具有这 2 个功能的类:

testclass.h

#include <QDebug>
#include <jni.h>

extern "C"
{
    JNIEXPORT void JNICALL Java_com_example_MyTestAndroidApp_LibraryClass_log();

    void logNormal();
}

testclass.cpp

JNIEXPORT void JNICALL Java_com_example_MyTestAndroidApp_LibraryClass_log()
{
    qDebug() << "---> log from Qt library";
}

void logNormal()
{
    qDebug() << "---> log from Qt library";
}

.pro我正在使用sharedstaticlib共享(.so)静态(.a)库切换的文件中的一个。

TEMPLATE = lib
CONFIG += shared
#CONFIG += staticlib
CONFIG += c++11

成功构建库(共享和静态)后,我得到了这个文件(对于 ABI x86,但其他 ABIS 也有类似的大小):

libTestLibrary.so ---> 3,359 KB

libTestLibrary.a ---> 7 KB

对于共享(.so)库,我能够成功地从 android 应用程序调用该函数。在 Android Studio 中,我正在创建新的Native C++项目。我有 Java JNI LibraryClas,它用于加载库并从库中调用log()函数。我将库放在jniLibs文件夹中。

但是对于static(.a)库来说有很多问题。我试图从 android 应用程序的 C++ 部分(从native-lib.cpp)调用 logNormal() 函数。我没有像在共享库案例中那样使用 JNI。这是我尝试过的:

  1. 创建新的 Native C++ 项目
  2. 在里面创建libs(用于静态库)和include(用于 testclass.h)文件夹app\src\main\cpp
  3. 在里面CMakeList.txt我添加了这个:

add_library(TestLibrary STATIC IMPORTED)

set_target_properties(TestLibrary PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libTestLibrary.a)

target_link_libraries( native-lib TestLibrary ${log-lib} )

  1. 我叫logNormal(); native-lib.cpp.

首先,我收到关于缺少 Qt5Core 库的错误。在以与我的库相同的方式添加它之后,我收到了其他缺少库和文件的错误。

我有这个问题:

  1. 为什么静态库比共享库小得多?(7KB vs 3,359KB)我发现与我的情况相反:

在此处输入图像描述

  1. 我可以用它需要的所有库和文件以某种方式构建我的静态库,这样我就不会因为缺少库而出错?
  2. 我可以使用 JNI 从静态库中调用 C++ 函数吗?或者当从静态库调用 C++ 函数时,必须从 android 项目的 C++ 部分完成?

对不起,很长的帖子和超过 1 个问题。欢迎任何提示或帮助。非常感谢你。

标签: androidc++qtshared-librariesstatic-libraries

解决方案


推荐阅读