我试图编译一个非常基本的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文件中)应该使用或不使用参数名。