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

时间:2015-07-06 14:01:02

标签: java c++ c oracle java-native-interface

我正在使用Linux(Ubuntu 12.10)。我在网上尝试了this问题和其他很多问题,但我无法解决我的问题。

这是java文件:

class HelloWorld
{
    public native void display();

    static
    {
        System.loadLibrary("HelloWorld");
    }   

    public static void main(String args[])
    {
        HelloWorld hw = new HelloWorld();
        hw.display();
    }
}

我使用javac HelloWorld.java编译了它。

然后我使用.classjavah -jni HelloWorld文件创建了头文件。我有这个头文件

/* 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

在此之后我创建了以下C文件:

#include <stdio.h>
#include "HelloWorld.h"

void display();

int main()
{
    display();
    return 0;
}

void display()
{
    printf("Hello World Naveen\n");
}

并使用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进行编译。

然后我做了echo $LD_LIBRARY_PATH=.。但是当我运行java HelloWorld时,我得到了UnsatisfiedLinkError

2 个答案:

答案 0 :(得分:3)

您的236,800 13,300 7,100 2,500 5,600 5,900 11,700 33,100 172,200 17,400 43,900 1,200 2,100 1,900 500 600 3,700 23,300 53,300 32,900 10,100 3,300 400 500 11,500 7,700 3,700 1,700 700 6,300 26,400 22,700 12,400 5,500 700 500 1,000 500 25,200 700 900 41,400 328,700 900 1,800 329,100 6,100 47,700 500 5,100 11,900 300 12,800 0 200 31,100 900 500 2,500 8,500 5,600 文件不应包含HelloWorld.cmain。相反,它应该包含display方法的实现。例如:

HelloWorld.display

答案 1 :(得分:2)

您在C文件中的本机函数的实现必须与生成的方法签名相匹配。

使用

JNIEXPORT void JNICALL Java_HelloWorld_display(JNIEnv * env, jobject obj)
{
}

void display()
{
}