我的工作环境是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条错误消息。
我搜索了互联网并找到了一个解决方案,说我的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自动生成的。
我非常感谢你提出的建议。
答案 0 :(得分:2)
您的第一个错误是因为您没有jni.h
,就这么简单。你必须找出它的位置并确保它在你的包含路径上。
顺便说一句,这是gcc
-I
(大写眼睛),而不是-l
(小写字母)。后者用于指定库使用而不是目录添加到包含路径。也就是说,我相信,你的具体问题在这里。
第二个错误是由第一个引起的,因为你在void
之前有这个未知令牌:
JNIEXPORT void JNICALL Java_org_owls_jni_HelloJNI_printMessage
毫无疑问,因为缺少jni.h
。