我有一个 jni dll,其中包含从 java 调用的函数。问题是这个 dll 包含默认包中的所有 java 类(在 dll“Java_classname_methodname”中)。获取此 dll 的源代码是不可能的,而且重写需要很长时间。所以我基本上需要在与默认不同的包中从 java 调用这个 dll 中的函数。我已经尝试了几个小时使用十六进制编辑器和几个工具来重命名 dll 中的函数来修改 dll 中的校验和和地址,但这对我来说太多了,因为我几乎没有这方面的经验。我非常喜欢这条路线,但我没有合适的工具或专业知识。所以我剩下的就是尝试在java中对包名进行硬编码。我尝试使用 jna如此描述堆栈溢出帖子做这样的事情:
Map options = new HashMap();
options.
put(
Library.OPTION_FUNCTION_MAPPER,
new StdCallFunctionMapper() {
public String getFunctionName(NativeLibrary library, Method method) {
method.setName(method.getName().replace("com.test.", "");
return super.getFunctionName(library, method);
}
}
);
Native.loadLibrary(..., ..., options);
但是Method中没有setName。理想情况下,我希望在没有任何额外库的情况下完成这项工作,但我显然不反对使用 jna 之类的东西。在有人问之前,是的,图书馆的使用许可证允许这样做。请不要告诉我这是不可能的,因为知道这是可能的,只是很难。无论必须采用哪种方式,我都愿意投入工作(修改 dll 或使用带有一些外部库的 java 代码)。顺便说一句,我最终还需要在 .so 和 .dylib 文件上完成此操作(不如 dll 重要)。感谢您的时间。