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



我试图编译一个非常基本的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++ optimization Compiler Version 19.31.31106.2 for x64微软公司版权所有。版权所有

Helloworld.c

.Helloworld.c(3):错误C2055:期望的正式参数列表,而不是类型列表

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

欢迎任何建议。由于

来自Microsoft文档:

期望的形式参数列表,而不是类型列表

函数定义包含参数类型列表而不是形式参数列表。ANSI C要求命名形式参数,除非它们是空的或有省略号(…)。

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文件中)应该使用或不使用参数名。

最新更新