android - 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:我为通用 Linux 平台构建的原始库
- libmain.so:将被android活动的JAVA调用的JNI库。
我可以通过打开libSmart.so fopen()
,但无法打开dlopen()
它返回NULL。
做这些有一些限制吗?或者Android中使用的任何库(甚至不是由JAVA直接调用)都必须使用JNI构建?
解决方案
推荐阅读
- android - SignedUp时如何阻止应用程序将用户发送到MainActivity?
- php - PHP 如何从 php 脚本登录到“FireFox Quantum”开发人员 Web 控制台
- python - 在 Pygame 中检测碰撞的简单方法
- javascript - 在 Promise 中编辑 .then()
- javascript - 在内容脚本中重新初始化 Int 变量(Chrome 扩展)
- android - Firebase Cordova Google 登录不起作用
- javascript - 直接到 .pdf 文件中的页面而不打开新选项卡
- apache-tomee - TomEE Plume 7.0.4 未部署不属于 org.superbiz 包的 REST 注释类
- python - 当遍历一个非常大的列表并每次迭代写入文件时,文件应该在循环中打开还是在循环外打开?
- java - 网站和安卓应用程序如何连接?