【问题标题】:How a Java application is extended by C++ Service Providers?C++ 服务提供者如何扩展 Java 应用程序?
【发布时间】:2014-07-07 18:48:01
【问题描述】:

我正在使用服务提供者概念创建一个可扩展的 Java 应用程序。我有一个名为 PoolTuningStrategy 的抽象类,它是一项服务,我的应用程序的用户以扩展此 PoolTuningStrategy 类的服务提供者的形式提供他们的服务,用户以 jar 文件的形式提供他们的实现,我的应用程序使用 ServiceLoader 类来动态加载服务提供者如下

int i=0;
for (PoolTuningStrategy foo : ServiceLoader.load(PoolTuningStrategy.class,urlloaders)) 
            strategy[i++]=foo;

现在 strategy[] 包含所有实现集。现在我的问题是“如何创建一个扩展我的 Java 抽象类 PoolTuningStrategy 的 C++ 类,以便我可以使用 C++ 服务提供者。”实际上,我希望 Java 和 C++ 程序员能够扩展我的应用程序。我只使用 Java 完成了它,但我不知道如何通过 C++ 实现来扩展我的 Java 应用程序。

【问题讨论】:

    标签: java c++ interface java-native-interface service-provider


    【解决方案1】:

    您可以创建一个 Java 类,该类通过 JNI 委托给 C++ 实现。然而,C++ 类不能从 Java 继承,Java 类也不能从 C++ 继承。您必须改用委托。

    【讨论】:

    • 好!假设我使用 JNI 和委托..那么 C++ 用户可以使用我的服务提供者接口。它是如何工作的?请向我发送有关此问题的链接或给我代码示例
    【解决方案2】:

    接近这一点的一种方法是使用商业产品JunC++ion,它有效地允许C++ 类实现Java 接口。

    在 Java 端,您可以创建一个新的具体类 CppPoolTuningStrategy,它接受回调接口 IPoolTuningStrategySPI 的实例。然后,您的 C++ 用户可以实现该接口。

    这消除了 C++ 用户编写 Java 胶水代码的需要。但是,它确实引入了第三方产品的成本。

    【讨论】:

    • 您能否给出一个关于您对 CppPoolTuningStrategy 的第二意见的小代码示例...。我喜欢它,因为您说“这消除了 C++ 用户编写 Java 胶水代码的需要”..我喜欢它,我想利用它,但我需要一个小的示例程序,因为我无法理解回调接口 IPoolTuningStrategySPI 的想法......
    • 这里有更多细节。在 Java 方面,新的具体类 CppPoolTuningStrategy 是用于处理 C++ 实现的代理类。每个实例仅通过com.mypackage.IPoolTuningStrategySPI 与 C++ 实现一起使用。在 C++ 方面,实现扩展了由 JunC++ion 创建的名为 com::mypackage::IPoolTuningStrategy 的 C++ 代理类——例如,class MyTuningStrategy : public com::mypackage::IPoolTuningStrategy。从 C++ 端,您可以将 MyTuningStrategy 传递给 Java 方法(通过 JunC++ion 为该方法生成的 C++ 代理)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2015-12-05
    • 2011-08-05
    相关资源
    最近更新 更多