jni 中的回调
有没有办法从 C 向 java 代码传递回调。并且调用立即返回。稍后,完成任务后,java 代码可以调用该回调。
我有一个 php 的 C 扩展,它调用 java 存储来在其中存储一些项目。可以通过同步和异步方法从存储中检索项目(我为存储提供键列表和回调,它调用回调并返回其中的项目)。
我能够从扩展中同步检索项目,但现在我不知道如何异步执行。
- 有什么方法可以让我的 C 代码提供一个指向 java 稍后可以调用的函数的指针吗?
- 或者是否有可能每次 C 代码要求异步检索项目时我都会创建一个 Java 线程,然后该 Java 线程调用一个可以将项目返回给用户的 C 函数?
作为最后的手段,我可能必须在 C 代码中创建一个线程,并在该线程中对可以从 java 检索的键进行排队。
或者 zend 是否有任何支持允许我对任务进行排队以及 zend 可以为队列中的每个任务一一调用的回调?
Is there any way to pass a callback to java code, from C. And the call returns immediately. Later on, after completing the task, the java code can invoke that callback.
I have a C extension for php that calls a java store to store some items in it. The items can be retrieved from store in synchronous and asynchronous methods (I provide the store with list of keys and a callback and it invoke the callback and return the item in it).
I am able to retrieve the items synchronously from extension, but now I don't know how to do it asynchronously.
- Is there any way that my C code can give a pointer to function that java can later invoke?
- OR is it possible that I create a java thread everytime C code asks to retrieve items asynchronously, and that java thread then invoke a C function that can return the items back to user?
As a last resort I may have to create a thread in C code and queue up keys in that thread that it can retrieve from java.
Or is there any support in zend that allows me to queue up tasks and a callback that zend can invoke one by one for every task in queue?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
java调用C函数的方式是原生类方法。只需在java中创建一些具有本机方法的类(可能实现您的回调接口)即可。编译它并使用 JDK 中的 javah 工具进行处理 - 这将创建带有函数签名的标头。然后你就可以在你的本地代码中实现这个功能了。
当您需要提供回调时 - 通过 NewObject() 创建此类的新实例并传递给 java 代码。
The way for java to call C functions is native class methods. Just make some class in java (probably implementing your callback interface) that has native method. Compile it and process with javah tool from JDK - this creates header with function signature. Then you can implement this function in your native code.
When you need to supply callback - create a new instance of this class via NewObject() and pass to java code.