这就是我想做的。我有一个第三方本地可执行文件,是由我的活动产生的。活动和本机可执行文件通过TCP进行通信。问题是——第三方应用程序正在使用libusb,因此需要root。所以我认为这可能是可能的,实际上写一个包装器libusb-java,有相同的接口作为原来的libusb,但使用Android USB主机API。因此,我可以链接我正在运行的可执行文件与我的libusb-java,而不改变它,它将使用Android USB主机API。问题是,如果我想编写libusb-java,我需要能够从库内部访问JVM(这将在第三方可执行文件启动时动态加载),但由于这不会在Java端被链接,因此我无法访问它。是否有一种简单的方法可以从本地可执行文件中调用一些java代码,而这些代码没有链接到活动(可能是反射?)。什么好主意吗?
例如:如果我的本机二进制文件调用*libusb_open()*,它实际上会从libusb-java调用*libusb_open()*,这反过来应该调用android.hardware.usb的openDevice()。UsbManager而不是原始的直接本机实现。(我过于简化了,但这是基本思想)
简单的回答:不,没有。你可以启动自己的Dalvik虚拟机,并可能调用它,但它不会在Android系统中作为一个活动存在,所以很难使用许多平台服务。
你最好尝试重构本机代码,使其作为一个库运行,由DVM以正常的Android方式加载,作为一个Activity-或Service-托管进程。有时,这几乎可以像从静态jni子例程调用它的main()一样简单,但要注意进程级静态数据中潜在的不一致,因为Android经常会在旧进程中启动一个新实体。
或者您可以通过TCP代理您的模拟API调用,[使用一些欺骗]Binder,或其他IPC机制。