问题描述
当我尝试在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";
}
我正在使用.pro
或shared
在staticlib
文件中从 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。这是我尝试过的:
- 创建新的Native C ++项目
- 在
libs
内创建了include
(用于静态库)和app\src\main\cpp
(用于testclass.h)文件夹 - 在
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} )
- 然后我从
native-lib.cpp
叫 lognormal(); 。
首先,我得到有关缺少Qt5Core库的错误。以与我的库相同的方式添加后,我因其他缺少的库和文件而出错。
我有这个问题:
- 为什么 static 库比 shared 库小得多? (7KB和3,359KB)我发现this与我的情况相反:
- 我能以某种方式用它需要的所有库和文件来构建我的静态库,这样我不会因缺少库而出错吗?
- 我可以使用JNI从静态库调用C ++函数吗?还是从静态库调用C ++函数时,必须从android项目的C ++部分完成?
很抱歉,冗长的帖子和另外1个问题。欢迎任何提示或帮助。提前非常感谢您。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)