【问题标题】:JNI - Is it possible to replace the instantiation of a class with a different class?JNI - 是否可以用不同的类替换类的实例化?
【发布时间】:2017-05-03 03:35:00
【问题描述】:

对于不具描述性的标题,我深表歉意,但我不确定如何用一句话来概括这一点。我拥有的是一个较旧的 DLL 文件,它从 java 中的默认包中调用所有内容。我无法在没有反射的情况下从默认包中导入这些类,我还需要重构它们。问题是我没有 DLL 的源代码,而且不可能得到它。我创建了一个重定向所有方法调用的中间 dll。例如,在 Java 中,我调用 refactoredMethod,它在中间 DLL 中调用 refactoredMethod,而中间 DLL 在原始 DLL 中调用 originalMethod。在原始 DLL 尝试执行以下操作之前,此方法工作正常:

jclass cls = (*env)->FindClass(env, "UnpackagedClass");

但很明显,由于我已经重构了这个类并将它移到了一个包中,所以它失败了。所以我想知道是否有可能替换

的所有实例
jclass cls = (*env)->FindClass(env, "UnpackagedClass");

在原始 DLL 中带有

jclass cls = (*env)->FindClass(env, "com/test/RefactoredClass");

来自中间 DLL。顺便说一句,在有人说之前,由于它的大小,无法重写原始DLL,除此之外不需要任何维护,我有权使用它。谢谢。

【问题讨论】:

  • DLL 从哪里得到UnpackagedClass?假设它是一个 jar 文件,你能用一个 class UnpackagedClass extends com/test/RefactoredClass {...} 替换这个 jar 文件吗?
  • 也许你可以用类加载器试试脏东西...

标签: java c++ dll java-native-interface


【解决方案1】:

如果你没有机会改变原来的DLL,考虑使用适配器模式。

如果您想将一个界面适配到另一个界面,则使用此模式。

我知道这可能会在您的 Java 实现中创建很多类,但如果您别无选择,我会这样做。

看看从包内部访问类的超级简单适配器:

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo028

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-10
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2022-06-27
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多