Рассматриваемый код является интерфейсом JNI между Java и собственным кодом.
Файл h создается утилитой javah, а файл cpp — человеком.
Если часть Java переименовывается, то javah создает прототипы функций с соответствующими именами, как и должно быть. Однако ничто не гарантирует, что функции в файле cpp также будут переименованы — все компилируется как обычно. Проблема возникнет только тогда, когда код Java вызывает собственный API во время выполнения.
Как можно обнаружить несоответствие между файлом h, созданным javah, и файлом 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);
}
Отредактируйте в ответ на ваши комментарии:
Другим (или дополнительным) подходом будет создание сценария, который выполняется как часть процесса сборки, и сохранение его в прежнем виде. generated.h
перед запуском Java, и вызвать ошибку сборки, если новый generated.h
отличается от старого. Это может даже запустить разница программа, которая выдаст вам сообщение об ошибке, чтобы точно определить изменения.
Других решений пока нет …