为什么同一个C ++库在静态版本中的大小比共享版本小得多,而共享工作时静态不起作用?

问题描述

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

我正在使用静态内置的 Qt 5.14.2 for Android 我有 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";
}

我正在使用.prosharedstaticlib文件中从 shared(.so static(.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(用于静态库)和app\src\main\cpp(用于testclass.h)文件
  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. 然后我从native-lib.cpp lognormal();

首先,我得到有关缺少Qt5Core库的错误。以与我的库相同的方式添加后,我因其他缺少的库和文件而出错。

我有这个问题:

  1. 为什么 static 库比 shared 库小得多? (7KB和3,359KB)我发现this与我的情况相反:

enter image description here

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

很抱歉,冗长的帖子和另外1个问题。欢迎任何提示或帮助。提前非常感谢您。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)