我想从 Java 调用 C 子例程。我正在使用 JNI。我创建了 .java、.c 和 .h 文件,并编译了 DLL。所有文件都在同一个文件夹中。但是当我运行该程序时,它显示unsatisfiedlinkError
。我哪里出错了...?
在学习JNI时,我使用的源代码来自:http://www.ibm.com/developerworks/java/tutorials/j-jni/section2.html http://www.ibm.com/developerworks/java/tutorials/j-jni/section2.html以及我已经尝试过的事情:
- 使用 Code::Blocks(ide) 和 GCC 作为编译器创建 dll
- 从命令行使用 GCC 创建 dll(参考文献 1)http://sig9.com/node/35 http://sig9.com/node/35 )
- 我使用的是Win7 32位,我猜上面的所有方法都会生成32位DLL
- 我找到的用于创建 DLL(共享库)的所有解决方案均适用于 MS VC/VCPP,但我的计算机上目前没有该解决方案。
哪里有问题? DLL 文件正在生成,没有任何异常,但是当我运行 Java 代码时,它会抛出异常。
PS:如果有任何理论示例可以解释 JNI 的工作原理及其实际作用,请分享链接...
抛出的消息或异常:
c:\myjava1>java Sample1
Exception in thread "main" java.lang.UnsatisfiedLinkError: Sample1.intMethod(I)I
at Sample1.intMethod(Native Method)
at Sample1.main(Sample1.java:11)
在多次创建 dll 文件之后,我很确定它可能没有问题,路径有问题......我已经更改了加载库方法与load方法,但仍然没有运气,......
根据 MOD 的建议:
我一直在帖子上讨论这个问题:调用 C 子例程时出现 JNI 错误,我在这里发布所有代码,因为注释字符有限... Sample1.c
#include "jni.h"
#include"Sample_Sample1.h"
JNIEXPORT jint JNICALL Java_Sample_Sample1_test(JNIEnv *env, jobject obj){
return(1);
}
void main(){}
示例1.java
package Sample;
public class Sample1
{
public native int test();
static{
System.loadLibrary("Sample1");
}
public static void main(String[] args)
{
Sample1 sample = new Sample1();
System.out.println(sample.test());
}
}
Sample_Sample1.h(使用javah -jni命令生成)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class Sample_Sample1 */
#ifndef _Included_Sample_Sample1
#define _Included_Sample_Sample1
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Sample_Sample1
* Method: test
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_Sample_Sample1_test
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
谁能指导我问题出在哪里?在上一篇文章中,我提到我正在使用的代码是教程中的代码,但为了简单说明我更改了代码......在使用 **java Sample.Sample1 时,我是得到:
c:\myjava1>java Sample.Sample1
线程“main”中的异常 java.lang.UnsatisfiedLinkError: Sample.Sample1.test()I
在 Sample.Sample1.test(本机方法)
在 Sample.Sample1.main(Sample1.java:12)