Компиляция — Есть ли способ убедиться, что C ++ .h соответствует соответствующий файл C ++ .cpp?

Рассматриваемый код является интерфейсом JNI между Java и собственным кодом.
Файл h создается утилитой javah, а файл cpp — человеком.

Если часть Java переименовывается, то javah создает прототипы функций с соответствующими именами, как и должно быть. Однако ничто не гарантирует, что функции в файле cpp также будут переименованы — все компилируется как обычно. Проблема возникнет только тогда, когда код Java вызывает собственный API во время выполнения.

Как можно обнаружить несоответствие между файлом h, созданным javah, и файлом cpp реализации, созданным человеком во время компиляции?

3

Решение

Как насчет ссылки на сгенерированные объявления функций где-то в коде 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 отличается от старого. Это может даже запустить разница программа, которая выдаст вам сообщение об ошибке, чтобы точно определить изменения.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]