从Android中的外部本机可执行文件调用java代码

时间:2013-01-02 19:52:48

标签: android reflection android-ndk java-native-interface libusb

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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