2012-11-29 61 views
3

有問題的代碼是Java和本機代碼之間的JNI接口。 h文件由javah實用程序生成,而cpp文件由人類創建。有沒有辦法確保C++ .h與相應的C++ .cpp文件匹配?

如果Java部分被重命名,那麼javah會使用相應的名稱生成函數原型,就像它應該那樣。但是,沒有什麼能確保cpp文件中的函數被重命名 - 所有的編譯都照常進行。只有當Java代碼在運行時調用本地API時纔會出現問題。

在編譯過程中,如何捕獲javah生成的h文件與人類生成的實現cpp文件之間的不匹配?

+1

聽起來像一個靜態代碼分析儀或棉絨工作。 –

+0

好的,請提供一個工作示例,以便您的答覆可以被接受爲答案。 – mark

+0

有幾種不同的軟件包可以提供這種功能,但我不知道具體哪種軟件包可以完全滿足您的需求 - 但是這應該爲您提供一個滿足您需求的產品的起點。 –

回答

2

如何在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程序給你一個錯誤信息來查明變化。

+0

這是一個好主意。我來檢查一下。 – mark

+0

這回答了Java代碼重命名時的情況,然後編譯器無法正常構建,只是我想要的。有一個缺點 - 開發者必須有紀律,才能爲neverCalled添加新的方法。 +1在此期間。 – mark

+0

儘管如此,不僅可以對重命名進行保護,而且還可以對參數類型的更改進行保護。在你的解決方案中(這是很棒的),人們必須將零置換到受尊敬的類型來實現這種效果,這有點沉悶。 – mark

相關問題