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

标签 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 类。 将其传递给 native 方法 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 程序是默认程序。 我真的不知道出了什么问题。 请帮我改正程序。 非常感谢您!!!

最佳答案

删除

#ifndef _Included_TestJni
#define _Included_TestJni

...

#endif

来自源文件。您已经在 header 中#define设置了 include 保护,因此这有效地注释掉了代码。

关于java.lang.UnsatisfiedLinkError : TestJni. print(LA;)V 错误在 Ubuntu 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28529340/

相关文章:

java - 对象的队列长度

java - 如何访问 Maven 项目中的 XML 文件以使其在打包时保持可用

c - 第二个 for 循环出现错误,导致程序进入无限循环。有人可以帮助我或指出我的错误吗?

c - 排序算法和数字之间的距离

c - "..."c 静态函数的最后一个参数

java - Log4j2 SMTP 附加程序 "Must issue a STARTTLS command first"

java - 导航说明

c++ - std::ignore 的要求

c++ - 如何删除在另一个函数中初始化的动态分配的数组?

C++通过继承函数实现继承的抽象函数