【发布时间】:2015-05-07 13:12:47
【问题描述】:
使用 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 应用程序时,会出现 OLD 问题:
拿起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
线程“主”java.lang.UnsatisfiedLinkError 中的异常:java.library.path 中没有 libHelloJNI
在 java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
在 java.lang.Runtime.loadLibrary0(Runtime.java:849)
在 java.lang.System.loadLibrary(System.java:1088)
在 HelloJNI.main(HelloJNI.java:22)
make: *** [运行] 错误 1
我在网上搜索过这个问题,发现这是一个老问题。但我无法找到任何方法来解决我的问题!!希望可以有人帮帮我。 提前致谢。
【问题讨论】:
-
您能否也粘贴您的本机文件
HelloJNI.c?这将使人们更容易重现这一点。 -
您需要
-Djava.library.path才能真正包含包含libHelloJNI.so的目录。 -
#include
#include #include "HelloJNI.h" JNIEXPORT void JNICALL Java_HelloJNI_sayHello (JNIEnv * env, jobject thisObj) { printf("Hello Momo. 这是C 代码。");返回; } -
询问有关使用本网站的非技术问题。我可以编辑我的问题吗?
-
是的,您可以编辑您的问题。您的问题下方有一个灰色的“编辑”文本。每个人都可以编辑您的问题。这就是 StackOverflow 的设计目的。
标签: java java-native-interface