【问题标题】:callbacks in jnijni中的回调
【发布时间】:2010-11-26 07:49:23
【问题描述】:

有没有办法从 C 向 java 代码传递一个回调。并且调用立即返回。稍后,在完成任务后,java 代码可以调用该回调。

我有一个用于 php 的 C 扩展,它调用一个 java 商店来在其中存储一些项目。可以通过同步和异步方法从存储中检索项目(我为存储提供键列表和回调,它调用回调并返回其中的项目)。

我能够从扩展同步检索项目,但现在我不知道如何异步进行。

  • 有什么方法可以让我的 C 代码提供指向 java 以后可以调用的函数的指针?
  • 或者我是否可以在每次 C 代码要求异步检索项目时创建一个 java 线程,然后该 java 线程调用可以将项目返回给用户的 C 函数?

作为最后的手段,我可​​能必须在 C 代码中创建一个线程,并在该线程中排队可以从 java 检索的键。

或者在zend中是否有任何支持允许我将任务排队以及zend可以为队列中的每个任务一个一个调用的回调?

【问题讨论】:

    标签: java c java-native-interface php-extension php-internals


    【解决方案1】:

    java调用C函数的方式是native类方法。只需在具有本机方法的 java 中创建一些类(可能实现您的回调接口)。使用 JDK 中的 javah 工具对其进行编译和处理 - 这将创建带有函数签名的标头。然后,您可以在本机代码中实现此功能。

    当您需要提供回调时 - 通过 NewObject() 创建此类的新实例并传递给 java 代码。

    【讨论】:

    • 本机函数调用是否会给我一个有效的 JniEnv 指针,该指针已被 C 程序加载?创建一个新的类实例并将其传递给java是否重要?你能给我一些示例代码吗?
    • 例如函数声明为 native int callback(string);将有 C 签名 jint Java_com_mypackage_MyClass_callback(JNIEnv *env, jobject class_instance, jstring parameter) - 你有 env,指向带有回调的类的指针和所有参数。我稍后会尝试提供示例代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多