1

我有一个 .dll 库,它以以下格式导出函数:

_Java_folder1_folder2_folder3_JavaClassName_javamethodname@16

我无法修改 .dll。它是给我的。

我需要编写一个 java 程序来调用 native javamethodname. 但是,我无法生成正确的头文件。如何生成具有上述指定签名的头文件?

我尝试了 javah -jni JavaClassName,但它没有给我想要的结果。当我从目录层次结构中调用 javah 时,我得到一个像这样的标题:

Java_JavaClassName_java方法名

当我尝试从目录层次结构外部调用 javah 时,出现错误。

另外,如何在Java前面的标头签名中获取下划线?即:_Java 不是 Java。

谢谢!

4

3 回答 3

1

将您的 Java 类放在包 folder1.folder2.folder3 中。

C 源代码将命名为“Java_folder1_folder2_folder3_JavaClassName_javamethodname”,不带下划线。

您需要确定本机方法期望的参数。

于 2012-06-20T19:12:23.663 回答
1

编写 Java 代码很容易:您创建一个包名为folder1.folder2.folder3的 Java 项目,并将您的类JavaClassNamenative javamethodname. 您不需要生成头文件或任何东西,这已经由创建 DLL 并具有与您正在重构的类相同的类的人完成。

Java_前缀是标准的由 JVM-JNI 链接器添加,您无需关心它。

但是,我在字里行间读到,前导下划线也有问题。它是一种“编译器装饰”,如果你只有 DLL(没有源代码,没有重新编译),你可能也注定要失败。各种编译器添加了各种“装饰”,以确保您不会混淆调用者 (JVM) 和被调用者 (DLL) 之间的调用约定。它具有一些可观察到的默认行为,并且可以被各种编译器选项和/或定义文件(MSVC 上的 .def)破坏。这两者都不适用于您的情况。所以你需要:

  1. 找出用于生成 DLL 的编译器
  2. 查找给定编译器为其生成观察到的符号装饰的调用约定
  3. JNICALL您的 DLL 只能通过 JVM 运行,该 JVM 具有与宏定义相同的调用约定$JAVA_HOME/include/your_platform/jni_md.h
于 2012-06-21T12:41:38.453 回答
0

如果 DLL 还没有附带带有本地方法声明的相应 Java 类,那么它是不完整的,并且可能 100% 无用。不应期望您对此进行逆向工程。它甚至可能构建不正确。在我进一步研究之前,我会要求提供证据证明它有效。该证据必须包括 Java 部分;否则不是证据。

于 2012-06-20T19:48:41.557 回答