2017-08-15 55 views
1

這種情況是,我試圖在Windows 10 32位機器上編譯netty-tcnative library版本2.0.3.Final。我收到以下錯誤:編譯靜態鏈接netty-tcnative失敗,與JDK中的jni.h不匹配

[INFO] .\src\jnilib.c(360): error C2373: 'JNI_OnLoad': redefinition; different type modifiers [C:<redacted>\netty-tcnative\openssl-static\target\native-build\vs2010.vcxproj] 
[INFO] C:\Program Files\Java\jdk1.8.0_131\include\jni.h(1945): note: see declaration of 'JNI_OnLoad' 
[INFO] .\src\jnilib.c(423): error C2373: 'JNI_OnUnload': redefinition; different type modifiers [C:<redacted>\netty-tcnative\openssl-static\target\native-build\vs2010.vcxproj] 
[INFO] C:\Program Files\Java\jdk1.8.0_131\include\jni.h(1948): note: see declaration of 'JNI_OnUnload' 

我那麼相比JNI_OnLoadJNI_UnLoadjnilib.c從對jni.h從JDK tcnative簽名。

jnilib.c

jint JNI_OnLoad(JavaVM* vm, void* reserved) 
... 
void JNI_OnUnload(JavaVM* vm, void* reserved) 

jni.h

/* Defined by native libraries. */ 
JNIEXPORT jint JNICALL 
JNI_OnLoad(JavaVM *vm, void *reserved); 

JNIEXPORT void JNICALL 
JNI_OnUnload(JavaVM *vm, void *reserved); 

我對Java的8更新131,但我查了這個頭回去的Java 7和它的定義相同的方式。看起來tcnative項目在issue 272中實現着色支持的同時更改了此文件。

我試圖修改jnilib.c以包含JNIEXPORTJNICALL宏,但它被構建過程覆蓋,並且無論我是否想要具有可重複構建而不涉及修改源文件。我究竟做錯了什麼?相同的構建環境能夠構建版本2.0.1.Final。

+0

如果jnilib.c被構建過程覆蓋,那麼您必須修改生成它的代碼,以便發出正確的聲明。據推測,目前的代碼生成器是爲一個系統構建的,其中'JNIEXPORT'和'JNICALL'宏都擴展爲無,而Windows則不然。 –

+0

@JohnBollinger這當然是一種選擇。這個相同的環境(它在虛擬機上)能夠構建這個庫的2.0.1.Final版本。因此,我感覺在庫中發生了一些變化,或者我不知道應該如何更改構建過程,或者庫維護人員有缺陷。我不確定它是哪個,我希望其中一位維護人員編鐘。 – ZuluForce

+0

問題是您的兩個函數的多個聲明不一致。一對聲明來自外部JNI頭,另一對來自生成的源代碼。由於外部頭文件定義了相應的JNI實現所期望的簽名和約定,因此唯一合理的解決方案是使生成的代碼與JNI頭文件保持一致。也許有更簡單的方法來實現這一點,而不是黑客的代碼生成器(檢查文檔),但如果你只對維護者的意見感興趣,那麼去一個項目特定的論壇。 –

回答