问题描述
很抱歉,这可能是我要问的愚蠢问题,但是我对在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类匹配。本机代码。