有问题的代码是Java和本机代码之间的JNI接口。 h文件由javah实用程序生成,而cpp文件由human创建。
如果重命名了Java部分,则javah会生成具有相应名称的函数原型,就像它应该的那样。但是,没有什么可以确保cpp文件中的函数也被重命名 - 所有编译都像往常一样。只有当Java代码在运行时调用本机API时才会出现此问题。
如何在编译期间捕获javah生成的h文件与人类生成的实现cpp文件不匹配?
答案 0 :(得分:2)
如何在C ++代码中的某处引用生成的函数声明?
E.g。 in(say)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
,如果新的{{{},则会导致构建错误1}}与旧的不同。它甚至可以运行 diff 程序来给你一个错误信息来确定变化。