我有一个.dll库,它以下列格式导出一个函数:
_Java_folder1_folder2_folder3_JavaClassName_javamethodname @ 16
我无法修改.dll。这是给了我的。
我需要编写一个java程序来调用本机javamethodname
。但是,我无法生成正确的头文件。如何生成带有上面指定签名的头文件?
我尝试了javah -jni JavaClassName,但它没有给我想要的结果。当我从目录层次结构中调用javah时,我会得到一个标题:
Java_JavaClassName_javamethodname
当我尝试从目录层次结构外部调用javah时,出现错误。
另外,如何在Java前面的标题签名中获得下划线?那就是:_Java而不是Java。
谢谢!
答案 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)破坏。这两种情况都不适用于您的情况。所以你需要:
JNICALL
$JAVA_HOME/include/your_platform/jni_md.h
宏相同的调用约定
醇>
答案 2 :(得分:0)
如果DLL没有附带相应的Java类和本机方法声明,那么它是不完整的,可能是100%无用的。不应该对此进行逆向工程。它甚至可能被错误地构建。在我进一步研究之前,我会要求证据证明它有效。该证据必须包括Java部分;否则它不是证据。