在ubuntu上使用JNI时出现java.lang.UnsatisfiedLinkError

曼库克

使用JNI时出现java.lang.UnsatisfiedLinkError。

我的测试环境:

Ubuntu 12.04 / 64位
JDK 1.7
gcc(Ubuntu / Linaro 4.6.3-1ubuntu5)

这是我的java来源:

public class HelloJNI {
    static {
        //System.loadLibrary("libHelloJNI");
    }

    private native void sayHello() ;

    public static void main(String[] args){
        //System.getProperties().list(System.out);
        String lib_path = System.getProperty("java.library.path");
        System.out.println("java.library.path=" + lib_path);

        System.loadLibrary("libHelloJNI");

        HelloJNI myJNI = new HelloJNI();
        myJNI.sayHello();
    }
}

这是我的C源代码:

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

JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj)
{
    puts("Hello Momo. This is C code.");
    return;
}

这是我的Makefile:

JNI_INC=-I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/linux"

JNI_LIB=libHelloJNI.so
JNI_OUT=$(JNI_LIB) HelloJNI.h HelloJNI.class
CFLAGS= $(JNI_INC) -fPIC -shared

all: $(JNI_OUT)

HelloJNI.h: HelloJNI.class
    javah -jni HelloJNI

$(JNI_LIB): HelloJNI.c HelloJNI.h
    gcc $(CFLAGS) -o $@  HelloJNI.c

HelloJNI.class: HelloJNI.java
    javac HelloJNI.java

run:
    java  HelloJNI
    #java -Djava.library.path=. HelloJNI

clean:
    rm $(JNI_OUT) 

当我运行Java应用程序时,会出现旧问题:

捡起JAVA_TOOL_OPTIONS:-Dfile.encoding = UTF8 java.library.path =。:/ home / mancook / cook / work / StSoftware / src / java / StTestJni / tutor01_HelloJNI:/ usr / java / packages / lib / amd64:/ usr / lib64:/ lib64:/ lib:/ usr / lib
线程“ main”中的异常java.lang.UnsatisfiedLinkError:
java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
java.library.path没有libHelloJNI HelloJNI.main(HelloJNI.java:22)
的java.lang.System.loadLibrary(System.java:1088)
的.lang.Runtime.loadLibrary0(Runtime.java:849)
make:*** [run] Error 1

我已经在互联网上搜索了这个问题,发现这是一个古老的问题但我CAN NOT找到任何方法来解决我的问题!希望可以有人帮帮我。预先谢谢

克里斯蒂安·胡杰(Christian Hujer)

您需要-Djava.library.path=.在Makefile中,并且需要使用System.loadLibrary("HelloJNI");-无lib前缀,无.so后缀加载库前缀和后缀由Java处理-考虑一下,Windows上的命名方案不同(愚蠢但事实)。并且要注意System.loadLibrary()代码中两次陷阱,如果仅更改其中之一,它仍然会失败。那实际上花了我几分钟:P

PS:我建议对您的Makefile进行一些更改。我会用$(RM)代替rm应该声明不是文件的目标.PHONY可以使用:=代替分配不引用自动变量的变量=我将使用一个单独的步骤来.so.o文件创建我会使用模式规则来编译Java,例如%.class: %.java我将使用模式规则来创建头文件,例如%.h: %.class-I东西应该是CPPFLAGS没有CFLAGS,因为它是预处理器。然后-shared应该进入LDFLAGS等等...

这是您的新产品Makefile

CPPFLAGS:=-I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/linux"

JNI_LIB:=libHelloJNI.so
JNI_OUT:=$(JNI_LIB) HelloJNI.o HelloJNI.h HelloJNI.class
CFLAGS:=-fPIC
LDFLAGS:=-shared

.PHONY: all
all: $(JNI_OUT)

%.h: %.class
    javah -jni HelloJNI

$(JNI_LIB): HelloJNI.o
    $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@

HelloJNI.o: HelloJNI.c HelloJNI.h

%.class: %.java
    javac HelloJNI.java

.PHONY: run
run:
    java -Djava.library.path=. HelloJNI

.PHONY: clean
clean:
    $(RM) $(JNI_OUT)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ECLIPSE-使用JNI时出现java.lang.UnsatisfiedLinkError

JNI java.lang.UnsatisfiedLinkError

java.lang.UnsatisfiedLinkError

月食:java.lang.UnsatisfiedLinkError

OpenCV java.lang.UnsatisfiedLinkError

与Android 5.0搭配使用时出现java.lang.UnsatisfiedLinkError

Linux中的java.lang.UnsatisfiedLinkError

Android中的java.lang.UnsatisfiedLinkError错误

java.lang.UnsatisfiedLinkError:dlopen失败:

java.lang.UnsatisfiedLinkError:否GurobiJni / Tomcat

java.lang.UnsatisfiedLinkError:无法加载库

java.lang.UnsatisfiedLinkError aacdecoder lib

java.lang.UnsatisfiedLinkError opencv-contrib

Ecplise Java JNI, java.lang.UnsatisfiedLinkError loading dll

JNI java.lang.UnsatisfiedLinkError,无法链接方法

JNI- java.lang.UnsatisfiedLinkError:找不到本机方法

如何在Ubuntu 16.04中解决java.lang.UnsatisfiedLinkError

Windows上的Hadoop错误:java.lang.UnsatisfiedLinkError

java.lang.UnsatisfiedLinkError:找不到实现(实现SDK时)

MacOs 上的 JNI 线程“main”java.lang.UnsatisfiedLinkError 中的异常

JNI:在Path上找到了库,但没有找到Method(java.lang.UnsatisfiedLinkError)

androidx renderscript崩溃“加载RS jni库时出错:java.lang.UnsatisfiedLinkError:从JNI_OnLoad返回的JNI_ERR”

以sudo方式运行java命令时出现java.lang.UnsatisfiedLinkError

如何在Java中修复java.lang.UnsatisfiedLinkError

运行android本机代码导致java.lang.UnsatisfiedLinkError

java.lang.UnsatisfiedLinkError和ADB中的未知错误

JSNI在GWT使得java.lang.UnsatisfiedLinkError中调用时

Android-java.lang.UnsatisfiedLinkError:未找到本机方法

更新到Android 5.0后的java.lang.UnsatisfiedLinkError