需要帮助在 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 但没有任何乐趣。不确定接下来要尝试什么。
欢迎任何建议。
谢谢
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 文件中)应该可以使用或不使用参数名称。
我正在尝试编译一个非常初级的 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 但没有任何乐趣。不确定接下来要尝试什么。
欢迎任何建议。 谢谢
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 文件中)应该可以使用或不使用参数名称。