我正在尝试在Windows 7 64位中使用JNI。 以下是我的步骤。
第1步。 在eclipse Kepler 4.3中打开新的Java Application项目。
第2步。 创建一个名为“HelloWorld”的Java类。 代码是
public class HelloWorld {
private static String lib_path = "C:\\Users\\thanks\\workspace\\Hello\\src\\";
private static String lib_file = "hello.dll";
String greeting = "Hello, Java World!";
public native void display();
public static void main(String[] args) {
HelloWorld hw = new HelloWorld();
System.out.println(hw.greeting);
hw.display();
System.out.println(hw.greeting);
}
static{
System.load(lib_path + lib_file);
}
};
步骤3.在'VS2013 dev命令提示符'中执行'javac'和'javah'命令。 实际命令如下。
javac HelloWorld.java
javah -jni HelloWorld
步骤4.现在我获得了HelloWorld.java,HelloWorld.class,HelloWorld.h。所以制作一个名为'HelloWorld.c'的'C'文件。代码在这里。
#include "HelloWorld.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
JNIEXPORT void JNICALL JAVA_HelloWorld_display(JNIENV* env, jobject jobj){
jfieldID fldid;
jstring greeting;
const char* tmp;
jclass instance = (*env)->GetObjectClass(env, jobj);
fprintf(stderr, "Start C Implementation.\n");
if(jobj == NULL){
fprintf(stderr, "Input pointer is null.\n");
return;
}
fldid = (*env)->GetFieldID(env, instance, "greeting", "Ljava/lang/String;");
if(fldid == NULL){
fprintf(stderr, "Failed to get field ID.\n");
return;
}
greeting = (*env)->GetObjectField(env, jobj, fldid);
tmp = (*env)->GetStringUTFChars(env, greeting, NULL);
printf("%s\n", tmp);
greeting = NewStringUTF(env, "Hello C World");
if(greeting == NULL){
printf("Out of Memory.\n");
return;
}
(*env)SetObjectField(env, jobj, fldid, greeting);
printf("End of C impelementation.\n");
return;
}
正如你在这里看到没有语法错误。
步骤4.现在我用'cl'编译器编译。命令是
cl HelloWorld.c -Fehello.dll -MD -LD
步骤4中出现问题。当我尝试该命令时,它会显示奇怪的语法错误。 (我不知道为什么Windows命令窗口不允许拖动。所以我只是发布错误代码。但所有消息都指向实际上不存在的语法错误。)
ErrorCode: C2143 - 支架。 C2040 - 参考水平。 C2146 - 找不到';'。 C2059 - 找不到'('。 C2054 - 找不到')'。
感谢您阅读并分享我的错误:D
答案 0 :(得分:0)
此行有语法错误:
(*env)SetObjectField(env, jobj, fldid, greeting);
你的意思是:
(*env)->SetObjectField(env, jobj, fldid, greeting);
这些错误通常指向可能对您有帮助的行号。
答案 1 :(得分:-1)
我解决了这个问题。它只是VS设置的问题。 由于我的VS编译选项是Win32(但我的操作系统是64位),它崩溃了。
我在VS中更改了我的编译选项后,效果很好:D
感谢@krsteeve。你的指点也是对的。