[英]JNI : Getting java.lang.UnsatisfiedLinkError for simple HelloWorld Program
I am using Linux (Ubuntu 12.10). 我正在使用Linux(Ubuntu 12.10)。 I have tried this question on SO and a lot others on the web, but I am not able to solve my problem. 我曾在SO上和网络上的许多其他问题上尝试过此问题,但无法解决我的问题。
Here is the java file : 这是java文件:
class HelloWorld
{
public native void display();
static
{
System.loadLibrary("HelloWorld");
}
public static void main(String args[])
{
HelloWorld hw = new HelloWorld();
hw.display();
}
}
I compiled it using javac HelloWorld.java
. 我使用javac HelloWorld.java
对其进行了javac HelloWorld.java
。
Then I created header file from .class
file using javah -jni HelloWorld
. 然后,我使用javah -jni HelloWorld
从.class
文件创建了头文件。 I got this header file 我得到了这个头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: display
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_display
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
After this I created the following C file : 之后,我创建了以下C文件:
#include <stdio.h>
#include "HelloWorld.h"
void display();
int main()
{
display();
return 0;
}
void display()
{
printf("Hello World Naveen\n");
}
and compiled this using gcc -o libHelloWorld.so -fPIC -lc -shared -I/usr/lib/jvm/java-6-oracle/include/ -I/usr/lib/jvm/java-6-oracle/include/linux HelloWorld.c
. 并使用gcc -o libHelloWorld.so -fPIC -lc -shared -I/usr/lib/jvm/java-6-oracle/include/ -I/usr/lib/jvm/java-6-oracle/include/linux HelloWorld.c
编译gcc -o libHelloWorld.so -fPIC -lc -shared -I/usr/lib/jvm/java-6-oracle/include/ -I/usr/lib/jvm/java-6-oracle/include/linux HelloWorld.c
。
Then I did echo $LD_LIBRARY_PATH=.
然后我echo $LD_LIBRARY_PATH=.
. 。 But when I run java HelloWorld
I am getting UnsatisfiedLinkError
但是,当我运行java HelloWorld
时,出现UnsatisfiedLinkError
Your HelloWorld.c
file should not contain main
or display
. 您的HelloWorld.c
文件不应包含main
或display
。 Instead it should contain an implementation of the HelloWorld.display
method. 相反,它应该包含HelloWorld.display
方法的实现。 For example: 例如:
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_display (JNIEnv * env, jobject obj) {
printf ("Hello World\n");
}
Your implementation of the native function in your C file must match the method signature that was generated. 您在C文件中对本机函数的实现必须与生成的方法签名匹配。
Use 采用
JNIEXPORT void JNICALL Java_HelloWorld_display(JNIEnv * env, jobject obj)
{
}
Not 不
void display()
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.