4

所以这就是我想要做的。我有一个由我的活动生成的第三方本机可执行文件。Activity 和本机可执行文件通过 TCP 进行通信。问题是 - 第三方应用程序正在使用libusb,因此需要 root。所以我认为实际上可以编写一个与原始libusb具有相同接口但使用 Android USB Host API的包装器libusb-java 。因此,我可以将我正在运行的可执行文件与我的libusb-java链接而不更改它,它将使用 Android USB Host API。问题是如果我想写libusb-java,我需要能够从库内部访问 JVM(它将在第三方可执行文件启动时动态加载),但由于这不会在 Java 端链接,我无法访问它。有没有一种简单的方法可以从未链接到 Activity 的本机可执行文件中调用一些 java 代码(可能是反射?)。有任何想法吗?

例如:如果我的原生二进制文件调用 *libusb_open()*,它实际上会从 libusb-java 调用 *libusb_open()*,而libusb-java又应该调用android.hardware.usb.UsbManager的openDevice()而不是原来的直接原生实现. (我过于简单化了,但这是基本思想)

4

1 回答 1

0

简单的回答:不,没有。您可以启动自己的 Dalvik VM 并可能调用它,但它不会作为 Activity 存在于 Android 系统中,因此很难使用许多平台服务。

您最好尝试重构本机代码以作为由 DVM 以正常 Android 方式加载的库作为活动或服务托管进程运行。有时这几乎可以像从静态 jni 子例程调用它的 main() 一样简单,但请注意进程级静态数据中潜在的不一致,因为 Android 通常会在旧进程中启动新实体。

或者,您可以通过 TCP、[使用一些技巧] Binder 或其他 IPC 机制代理您的模拟 API 调用。

于 2013-01-02T22:43:19.660 回答