有問題的代碼是Java和本機代碼之間的JNI接口。 h文件由javah實用程序生成,而cpp文件由人類創建。有沒有辦法確保C++ .h與相應的C++ .cpp文件匹配?
如果Java部分被重命名,那麼javah會使用相應的名稱生成函數原型,就像它應該那樣。但是,沒有什麼能確保cpp文件中的函數被重命名 - 所有的編譯都照常進行。只有當Java代碼在運行時調用本地API時纔會出現問題。
在編譯過程中,如何捕獲javah生成的h文件與人類生成的實現cpp文件之間的不匹配?
有問題的代碼是Java和本機代碼之間的JNI接口。 h文件由javah實用程序生成,而cpp文件由人類創建。有沒有辦法確保C++ .h與相應的C++ .cpp文件匹配?
如果Java部分被重命名,那麼javah會使用相應的名稱生成函數原型,就像它應該那樣。但是,沒有什麼能確保cpp文件中的函數被重命名 - 所有的編譯都照常進行。只有當Java代碼在運行時調用本地API時纔會出現問題。
在編譯過程中,如何捕獲javah生成的h文件與人類生成的實現cpp文件之間的不匹配?
如何在C++代碼中引用生成的函數聲明?
E.g.在(比方說)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
與舊的generated.h
不同,則會導致構建錯誤。它甚至可以運行一個diff程序給你一個錯誤信息來查明變化。
聽起來像一個靜態代碼分析儀或棉絨工作。 –
好的,請提供一個工作示例,以便您的答覆可以被接受爲答案。 – mark
有幾種不同的軟件包可以提供這種功能,但我不知道具體哪種軟件包可以完全滿足您的需求 - 但是這應該爲您提供一個滿足您需求的產品的起點。 –