jni.h并在'void'之前预期'=',',',';','asm'或'__attribute__'

时间:2013-04-25 07:10:42

标签: c macos syntax java-native-interface header-files

我的工作环境是mac OSX 10.8.3。

现在我正在测试JNI。

我制作了HelloJNI.java文件并在终端中执行了javac和javah命令。

所以我得到了HelloJNI.java,HelloJNI.class,org_owls_jni_HelloJNI.h文件。

然后我把

gcc -g -l/usr/local/java/include -l/usr/local/java/include/linux -shared HelloJNI.c -o libhello.so

命令运行程序。并面临2条错误消息。

  1. jni.h:没有这样的文件或目录
  2. 在'void'之前预期'=',',',';','asm'或'属性'
  3. 我搜索了互联网并找到了一个解决方案,说我的jdk升级到1.7。但我不能这样做,因为其他人使用1.6。所以我需要另一个解决方案来解决jdk 1.6的问题。

    对于第二个问题,我在stackoverflow中找到了一些文章。他们说他们缺少一些语法。但对我来说,在无效之前我找不到任何问题。请看看我的头文件。

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class org_owls_jni_HelloJNI */
    
    #ifndef _Included_org_owls_jni_HelloJNI
    #define _Included_org_owls_jni_HelloJNI
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     org_owls_jni_HelloJNI
     * Method:    printMessage
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_org_owls_jni_HelloJNI_printMessage
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

    我认为这没问题,因为它是由命令javah自动生成的。

    我非常感谢你提出的建议。

1 个答案:

答案 0 :(得分:2)

您的第一个错误是因为您没有jni.h,就这么简单。你必须找出它的位置并确保它在你的包含路径上。

顺便说一句,这是gcc -I(大写眼睛),而不是-l(小写字母)。后者用于指定使用而不是目录添加到包含路径。也就是说,我相信,你的具体问题在这里。

第二个错误是由第一个引起的,因为你在void之前有这个未知令牌:

JNIEXPORT void JNICALL Java_org_owls_jni_HelloJNI_printMessage
毫无疑问,因为缺少jni.h