首页 > 解决方案 > Android下的JNI库中是否可以调用通用共享库?

问题描述

我有一个为一般 Linux 平台使用(x86、armv7a)而构建的动态链接库(.so),现在我将移植该库以供 Android 使用。

我期望的是在 JNI 库的 CPP 代码中使用dlopen来访问另一个不是 JNI 形式的库。这样我只需要开发几个JNI函数来桥接原库的导出函数。

这一切都是为了避免重建原始库的整个代码。源文件数量众多,结构非常复杂。否则我必须为他们重写 NDK 构建的 makefile。

为了尝试这个概念,我几乎进入了最后一步。

首先,我将原始库和JNI库放在设备根文件系统中的/data/data/com.example.myapp/lib位置(我使用Android Studio中的模拟器,该工具将复制项目lib中的.so文件文件夹自动安装)。

下面我使用adt登录android的shell并发出file命令列出lib目录中的文件

generic_x86_arm:/data/data/com.example.myapp/lib # file *
libSmart.so: ELF shared object, 32-bit LSB 386, BuildID=179c89de2ebe921fe1b9be6e78e83148f3781568, stripped
libmain.so:  ELF shared object, 32-bit LSB 386, for Android 16, built by NDK r21e (7075529), BuildID=6b395607222185aac9c163dc205b26add1ab55c4, stripped

我可以通过打开libSmart.so fopen(),但无法打开dlopen()它返回NULL。

做这些有一些限制吗?或者Android中使用的任何库(甚至不是由JAVA直接调用)都必须使用JNI构建?

标签: androidc++shared-libraries

解决方案


推荐阅读