Java 编译静态链接的netty tcnative失败,与JDK中的jni.h不匹配

Java 编译静态链接的netty tcnative失败,与JDK中的jni.h不匹配,java,c,openssl,java-native-interface,netty,Java,C,Openssl,Java Native Interface,Netty,情况是,我正试图在Windows10 32位机器上编译版本2.0.3.Final。我得到以下错误: [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

情况是,我正试图在Windows10 32位机器上编译版本2.0.3.Final。我得到以下错误:

[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.h

我正在使用Java8更新131,但我检查了返回到Java7的这个标题,它的定义是相同的。在中实现着色支持时,tcnative项目似乎更改了此文件


我试图修改
jnilib.c
以包含
JNIEXPORT
JNICALL
宏,但它被构建过程覆盖,不管怎样,我希望有一个不涉及修改源文件的可重复构建。我做错了什么?相同的生成环境能够生成版本2.0.1.Final。

被合并并修复了问题。这将是netty tcnative 2.0.7.Final的一部分。如果jnilib.c被构建过程覆盖,那么您必须修改生成它的代码,以便发出正确的声明。据推测,当前的代码生成器是为
JNIEXPORT
JNICALL
宏都扩展为空的系统构建的,而Windows上则不是这样。@JohnBollinger这当然是一个选项。同样的环境(在VM上)也能够构建此库的2.0.1.1最终版本。因此,我觉得库中发生了一些变化,要么我不知道应该如何更改构建过程,要么库维护人员有一个bug。我不确定它是哪一个,我希望有一个维护人员插话。问题是两个函数的多个声明不一致。一对声明来自外部JNI头,另一对来自生成的源代码。由于外部头定义了相应JNI实现所期望的签名和约定,因此唯一合理的解决方案是使生成的代码与JNI头一致。也许有比破解代码生成器(查看文档)更简单的方法来实现这一点,但是如果你只对维护人员的评论感兴趣,那么就去一个特定于项目的论坛。我发出了解决方案。
jint JNI_OnLoad(JavaVM* vm, void* reserved)
...
void JNI_OnUnload(JavaVM* vm, void* reserved)
/* Defined by native libraries. */
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved);

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