java.lang.UnsatisfiedLinkError:Ubuntu上的TestJni.print(LA;)V错误

时间:2015-02-15 18:09:20

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

我知道这是一个经常出现的问题,在网上搜索后,问题仍未解决。 -Djava.library.path已添加到命令中。

这是我的java文件

public class TestJni
{
        public native void print(A a);

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

        public static void main(String []args){
                new TestJni().print(new A());
        }
}
class A{
        void show(){
                System.out.println("In a show function");

        }
}

我正在尝试创建一个实例' a'这是A级。 将它传递给本机方法print并让native方法调用show()方法。 将.java编译为.class

javac TestJni.java

现在我有三个文件:A.class TestJni.class TestJni.java

使用

javah -classpath . TestJni

获取.h文件,如:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestJni */

#ifndef _Included_TestJni
#define _Included_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TestJni
 * Method:    print
 * Signature: (LA;)V
 */
JNIEXPORT void JNICALL Java_TestJni_print
  (JNIEnv *, jobject, jobject);

#ifdef __cplusplus
}
#endif
#endif

通过

将其重命名为MyJni.h
mv TestJni.h MyJni.h

创建MyJni.c
vim MyJni.c

MyJni.c的内容是:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include "MyJni.h"
/* Header for class TestJni */

#ifndef _Included_TestJni
#define _Included_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TestJni
 * Method:    print
 * Signature: (LA;)V
 */
JNIEXPORT void JNICALL Java_TestJni_print
  (JNIEnv *env, jobject obj, jobject o){
    jclass cls = (*env)->GetObjectClass(env, o);
    jmethodID mid = (*env)->GetMethodID(env, cls, "show", "()V");
    (*env)->CallVoidMethod(env, o, mid);

}

#ifdef __cplusplus
}
#endif
#endif

通过

构建.so文件
gcc -fPIC -shared -o libMyJni.so MyJni.c -I. -I$JAVA_HOME/include -I$JAVA_HOME/include/linux

现在我的目录中有5个文件[A.class libMyJni.so MyJni.c MyJni.h TestJni.class TestJni.java]:/ home / grid / code / tmp

运行java程序:

java -cp . -Djava.library.path=. TestJni

现在我得到的错误是

Exception in thread "main" java.lang.UnsatisfiedLinkError: TestJni.print(LA;)V
    at TestJni.print(Native Method)
    at TestJni.main(TestJni.java:10)

我在Ubuntu 14.10下编码,gcc程序是默认程序。 我真的无法弄清楚出了什么问题。 请帮我纠正程序。 非常感谢你提前!!!

3 个答案:

答案 0 :(得分:1)

删除

#ifndef _Included_TestJni
#define _Included_TestJni

...

#endif
来自源文件

。您已经#define在标题中添加了包含警示,因此这有效地注释了代码。

答案 1 :(得分:0)

删除#include "MyJni.h"

#ifndef _Included_TestJni
#define _Included_TestJni
//..
#endif

Exception in thread "main" java.lang.UnsatisfiedLinkError: TestJni.print(LA;)V这通常发生在JNI无法在您的库中找到符号定义时。您可以使用nm来分析您调用的JNI函数,以查看它是否已在库中定义和导出。

$ nm libMyJni.so 
00000000000005ac T Java_TestJni_print
0000000000200e40 a _DYNAMIC
0000000000200fe8 a _GLOBAL_OFFSET_TABLE_
                 w _Jv_RegisterClasses
0000000000200e20 d __CTOR_END__
0000000000200e18 d __CTOR_LIST__

答案 2 :(得分:-1)

您可以尝试使用System.load。 iirc System.loadLibrary从默认位置加载.so / .dll文件。 System.load应该使用.so / .dll文件的绝对路径。