有问题的代码是 Java 和本机代码之间的 JNI 接口。h 文件由 javah 实用程序生成,而 cpp 文件由人创建。
如果 Java 部分被重命名,那么 javah 会生成具有相应名称的函数原型,就像它应该的那样。但是,没有什么可以确保 cpp 文件中的函数也被重命名——所有编译都照常进行。仅当 Java 代码在运行时调用本机 API 时才会出现此问题。
javah 生成的 h 文件与编译过程中人类生成的实现 cpp 文件之间如何发现不匹配?
有问题的代码是 Java 和本机代码之间的 JNI 接口。h 文件由 javah 实用程序生成,而 cpp 文件由人创建。
如果 Java 部分被重命名,那么 javah 会生成具有相应名称的函数原型,就像它应该的那样。但是,没有什么可以确保 cpp 文件中的函数也被重命名——所有编译都照常进行。仅当 Java 代码在运行时调用本机 API 时才会出现此问题。
javah 生成的 h 文件与编译过程中人类生成的实现 cpp 文件之间如何发现不匹配?
在 C++ 代码中的某处引用生成的函数声明怎么样?
例如,在(比如说)generated_check.cpp
创建一个使用虚拟参数调用原型的函数(但从不调用它):
#include "generated.h" // your javah output
static void neverCalled() {
// Compiler errors here mean that the functions have changed:
Java_com_example_package_MyClass_myFunc1(0, 0, 0);
Java_com_example_package_MyClass_myFunc2(0);
}
编辑,以回应您的评论:
另一种(或补充)方法是创建一个作为构建过程的一部分运行的脚本,并在运行 javah 之前将其备份旧generated.h
版本,如果新版本与旧版本不同,则会导致构建错误generated.h
。它甚至可以运行一个diff程序来给你一个错误信息来查明变化。