您可以直接在android应用程序中链接静态库吗?

问题描述

很抱歉,这可能是我要问的愚蠢问题,但是我对在android中链接静态/共享库有疑问。

我正在创建一个新的 C ++ Native android studio项目。构建完成后,我打开apk文件,并在lib文件夹中的每个ABI放置了库libnative-lib.so APK 的大小为 3.580KB

但是如果我在CMakeLists.txt内部进行更改以构建本机库,例如 Static lib,那么现在我得到了:

add_library(native-lib
             STATIC
             native-lib.cpp)

构建APK后,我找不到静态库( libnative-lib.a )。 apk中没有lib文件夹。此外,大小为 2.836 KB

有人可以解释(或给我链接以获得更多有关此信息)在 STATIC 版本中放置该库的位置吗?

在运行时,如果链接静态,则会出错:

No implementation found for java.lang.String com.example.myapplication.MainActivity.stringFromJNI() 

解决方法

您不能直接在Android应用中使用 native 静态库。

Android用户空间基本上是Java(或更确切地说是Dalvik VM)。 因此,所有面向用户的应用程序都必须使用Java或Kotlin(都可以编译为Dalvik字节码)编写。

静态C / C ++库必须链接到要使用的C / C ++可执行文件或动态库。无法通过Linux或Android直接加载它们。

由于Android应用程序中没有C / C ++可执行文件,因此将静态库与Android应用程序一起使用的唯一方法是将其与可通过{{ }}。

由于JNI使用系统加载程序加载该库,因此它只能加载动态库,在这些动态库中,只有那些导出具有正确命名约定的函数,以便它们可以与将用于调用Java的Java类匹配。本机代码。