简体   繁体   English

JNI:为简单的HelloWorld程序获取java.lang.UnsatisfiedLinkError

[英]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文件不应包含maindisplay 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM