1

我的工作环境是 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' 或 '<strong>attribute'</li>

我搜索了互联网并找到了一个解决方案,将我的 jdk 升级到 1.7。但我不能这样做,因为其他人使用 1.6。所以我需要另一种解决方案来处理 jdk 1.6 的这个问题。

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

/* 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 自动生成的。

我非常感谢您提前提出的建议。

4

1 回答 1

2

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

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

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

JNIEXPORT void JNICALL Java_org_owls_jni_HelloJNI_printMessage

无疑是因为失踪jni.h

于 2013-04-25T07:18:17.720 回答