如何生成特定的JNI标头

时间:2012-06-20 19:00:20

标签: java c header java-native-interface javah

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

_Java_folder1_folder2_folder3_JavaClassName_javamethodname @ 16

我无法修改.dll。这是给了我的。

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

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

Java_JavaClassName_javamethodname

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

另外,如何在Java前面的标题签名中获得下划线?那就是:_Java而不是Java。

谢谢!

3 个答案:

答案 0 :(得分:1)

将Java类放在包folder1.folder2.folder3。

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

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

答案 1 :(得分:1)

编写java代码很简单:创建一个包含名称为 folder1.folder2.folder3 的Java项目,并将JavaClassName类放在那里native javamethodname。您不需要生成标题或任何内容,这些标题已经由创建DLL并且与您正在重建的类具有相同类的人完成。

The Java_ prefix is standard并由JVM-JNI链接器添加,您不需要关心它。

但是,我在这两行之间读到了您对前导下划线的问题。它是一个"编译器装饰"如果你只有DLL(没有源代码,没有重新编译),你可能会注定失败。各种编译器添加了各种各样的装饰"确保您不会混淆调用者(JVM)和被调用者(DLL)之间的调用约定。它有一些observable default behavior,可以被various compiler options和/或定义文件(MSVC上的.def)破坏。这两种情况都不适用于您的情况。所以你需要:

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

答案 2 :(得分:0)

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