JNI - 是否可以用不同的类替换类的实例化?

时间:2017-05-03 03:35:01

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

我为这个不起眼的头衔道歉,但我不确定如何用一句话来概括。我所拥有的是一个较旧的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,除此之外它不需要任何维护,我有权使用它。谢谢。

1 个答案:

答案 0 :(得分:0)

如果您没有机会更改原始DLL,请考虑使用适配器模式。

此模式用于您希望将一个界面适应另一个界面的情况。

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

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

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