java - 编译静态链接的 netty-tcnative 失败,与来自 JDK 的 jni.h 不匹配

标签 java c openssl java-native-interface netty

情况是我正在尝试编译 netty-tcnative library Windows 10 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'

然后我将 tcnative 的 jnilib.c 中的 JNI_OnLoadJNI_UnLoad 的签名与 jni.h 来自 JDK。

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 update 131,但我检查了这个返回到 Java 7 的 header ,它的定义方式相同。在 issue 272 中实现着色支持时,tcnative 项目似乎更改了此文件.

我尝试修改 jnilib.c 以包含 JNIEXPORTJNICALL 宏,但它被构建过程覆盖,无论我希望有一个不涉及修改源文件的可重复构建。我究竟做错了什么?相同的构建环境能够构建版本 2.0.1.Final。

最佳答案

https://github.com/netty/netty-tcnative/pull/300已合并并解决了问题。这将是 netty-tcnative 2.0.7.Final 的一部分

关于java - 编译静态链接的 netty-tcnative 失败,与来自 JDK 的 jni.h 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45700277/

相关文章:

android - OpenSSL Android NDK 的包装类

java - 具有持久工作实例的线程池

java - Android 套接字读取字符串时出现错误

c - 每行打印相同数量的字符

c - 体系结构 x86_64 的 undefined symbol "_min"

java - 在 C++ 或 Java 中以响应模式使用 cmd

java - 如何在数字模式之间允许特定分隔符

java - 以 HH :MM (Not time) 的形式存储数值

c - 从这个函数接收值需要什么数据类型?

postgresql - 在 PostgreSQL 数据库上启用 FIPS