jni 用 cl 编译器编译有语法错误,但不相关

问题描述 投票:0回答:2

我正在尝试在 Windows 7 64 位中使用 JNI。 下面是我的步骤。

步骤1。 在 eclipse Kepler 4.3 中打开新的 Java 应用程序项目。

步骤 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命令窗口不允许拖动。所以我只是发布错误代码。但所有消息都指向实际上不存在的语法错误。)

错误代码: C2143——支架。 C2040——参考水平。 C2146 - 找不到“;”。 C2059 - 找不到“(”。 C2054 - 找不到“)”。

感谢您阅读并分享我的错误:D

visual-studio java-native-interface syntax-error
2个回答
1
投票

此行有语法错误:

(*env)SetObjectField(env, jobj, fldid, greeting);

您的意思是:

(*env)->SetObjectField(env, jobj, fldid, greeting);

这些错误通常指向可能对您有帮助的行号。


-1
投票

我解决了这个问题。这只是VS设置的问题。 由于我的VS编译选项是Win32(但我的操作系统是64位),所以崩溃了。

在 VS 中更改编译选项后,效果很好:D

感谢@krsteeve。你的指点也是对的。

© www.soinside.com 2019 - 2024. All rights reserved.