简介:我有一个带有 Java (JNI) 包装器的本机库 (C++)。库引擎是 cpu 密集型的,我们不希望同时运行多个链接此库的应用程序,并且库引擎应返回复杂的对象。
问题:设计这样一个 Android 库的最佳方法是什么?
到目前为止,我只能找到 2 个有价值的示例:OpenCV manager和Connectbot ssh-agent。
我能想到几个解决方案:
解决方案 1:制作一个包装库功能的(绑定或 AIDL)服务。(服务应该在自己的空间中运行?还是在链接到它的应用程序的空间中运行?如果它在不同的应用程序空间(
System.load("/data/data/com.company.myLib/lib.so")
)中如何加载本机库。如何在 AIDL 中返回复杂对象?)。这应该是 Connectbot 的方式。解决方案 2:将 lib 分为 2 个组件:
- 一个独立的包,它保留了本地库 + 一个管理器服务
- 一个 android lib-project,它只包含 Java 包装器,用户可以使用它来构建他们的应用程序。
这应该是 OpenCV 管理器的方式。我不知道确切的细节,但这种方式不需要服务来接口并且可以只是
import com.company.myLib.LibWrapper
. 另一方面,LibWrapper 类应该执行System.load("/data/data/com.company.myLib/lib.so")
. 正确的?
我个人会选择解决方案 2。不幸的是,Android 是一片新大陆,关于如何开发库的模型还不多。还有其他/更好的解决方案吗?还有其他需要考虑的吗?