需要帮助在 VS2022 上编译 JNI 程序

Need help compiling a JNI program on VS2022

我正在尝试编译一个非常初级的 JNI 程序。 Java 代码是:

public class Helloworld {
    public static void main(String[] args) {
        System.out.println("Hello World !!");
        new Helloworld().sayHello();
    }

    private native void sayHello();
}

我采取的下一步是在 IDE (Intellij IDEA) 之外编译它,使用命令行选项 javac -h ... 这会生成机器生成的 Helloworld.h 文件。 接下来我写了一个同样初级的C程序,代码在这里:

#include "Helloworld.h"

JNIEXPORT void JNICALL Java_Helloworld_sayHello(JNIEnv *, jobject){
  printf("\nSay something... Anything...");
 }

我尝试使用 VS 2022 dll 选项进行编译,首先使用预编译头文件,然后不使用预编译头文件,但没有成功。出现了大量的错误。在 VS 环境中编译它是理想的,因为计划从 Java 调用的实际代码包含 C 和 AVX512 程序集的混合,因此具有 IDE 支持将有一直很理想(尤其是在调试期间)。非常欢迎任何关于如何将其编译为 Java 可接受的 .dll 库的建议。

然后我搬出了VS 2022,使用了如下命令行编译字符串:

cl /c /I "C:\Program Files\Microsoft\jdk\include\" /I "C:\Program Files\Microsoft\jdk\include\win32\" .\Helloworld.c

这给出了以下非常持久的错误:

Microsoft (R) C/C++ 针对 x64 优化编译器版本 19.31.31106.2 版权所有 (C) Microsoft Corporation。保留所有权利。

Helloworld.c

.\Helloworld.c(3):错误 C2055:需要形式参数列表,而不是类型列表

我尝试将形式参数从 jobject 更改为 jobject j,但没有成功(显然,因为 jni.h 中的定义表明 jobject 是 _jobject * 的类型定义)。 我试图通过使用 cl 命令选项 /U __cplusplus 取消定义 __cplusplus 但没有任何乐趣。不确定接下来要尝试什么。

欢迎任何建议。 谢谢

来自Microsoft's documentation

expected formal parameter list, not a type list

A function definition contains a parameter type list instead of a formal parameter list. ANSI C requires formal parameters to be named unless they are void or an ellipsis (...).

void func(int, char) {}        // C2055
void func (int i, char c) {}   // OK

您的函数定义是您的 .c 文件中的函数定义,即

JNIEXPORT void JNICALL Java_Helloworld_sayHello(JNIEnv *, jobject) {
    ...
}

您需要将其更改为

JNIEXPORT void JNICALL Java_Helloworld_sayHello(JNIEnv *env, jobject thiz) {
    ...
}

任何相应的函数 声明(例如在 .h 文件中)应该可以使用或不使用参数名称。