3

有问题的代码是 Java 和本机代码之间的 JNI 接口。h 文件由 javah 实用程序生成,而 cpp 文件由人创建。

如果 Java 部分被重命名,那么 javah 会生成具有相应名称的函数原型,就像它应该的那样。但是,没有什么可以确保 cpp 文件中的函数也被重命名——所有编译都照常进行。仅当 Java 代码在运行时调用本机 API 时才会出现此问题。

javah 生成的 h 文件与编译过程中人类生成的实现 cpp 文件之间如何发现不匹配?

4

1 回答 1

2

在 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程序来给你一个错误信息来查明变化。

于 2012-11-29T19:19:52.863 回答