如何生成特定的 JNI 标头



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

_Java_folder1_folder2_folder3_JavaClassName_javamethodname@16

我无法修改.dll。它给了我。

我需要编写一个java程序来调用本机javamethodname。但是,我在生成正确的头文件时遇到问题。如何使用上面指定的签名生成头文件?

我尝试了javah -jni JavaClassName,但它没有给我想要的结果。当我从目录层次结构内部调用javah时,我得到一个标题,如下所示:

Java_JavaClassName_javamethodname

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

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

谢谢!

编写 java 代码很简单:你创建一个包名 folder1.folder2.folder3 的 Java 项目,然后用一个native javamethodname把你的类JavaClassName放在那里。您不需要生成标头或任何东西,这已经由创建 DLL 并且与您正在重建的类相同的人完成。

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

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

  1. 了解用于生成 DLL 的编译器
  2. 查找给定编译器为其生成观察到的符号修饰的调用约定
  3. 您的 DLL 只能通过 JVM 运行,JVM 具有相同的调用约定,JNICALL $JAVA_HOME/include/your_platform/jni_md.h 中定义为

把你的 Java 类放在包文件夹1.folder2.folder3 中。

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

您需要确定本机方法需要哪些参数。

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

最新更新