我正在尝试按照本教程构建我的第一个 JNI 应用程序:https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html
问题摘要:运行应用程序时,出现 java.lang.UnsatisfiedLinkError 错误。
首先我写了这个类HelloJNI.java:
public class HelloJNI {
static {
System.loadLibrary("hello"); // Load native library at runtime
// hello.dll (Windows) or libhello.so (Unixes)
}
// Declare a native method sayHello() that receives nothing and returns void
private native void sayHello();
// Test Driver
public static void main(String[] args) {
new HelloJNI().sayHello(); // invoke the native method
}
}
我编译的这个类是:javac HelloJNI.java接下来我跑了javahHelloJNI这产生了以下文件HelloJNI.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */
#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
接下来我实现了HelloJNI.c:
#include <jni.h>
#include <stdio.h>
#include "HelloJNI.h"
// Implementation of native method sayHello() of HelloJNI class
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
printf("Hello World!\n");
return;
}
最后我编译了c类:
- gcc -I"/usr/lib/jvm/java-8-oracle/include" -I"/usr/lib/jvm/java-8-oracle/include/linux" -c -Wall -Werror -fpic HelloJNI.c
- gcc -shared -o hello.so HelloJNI.o
这会生成文件 hello.so 和 HelloJNI.o。接下来我尝试运行代码:
-
java -Djava.library.path=.你好JNI
这会产生错误:
线程“main”中出现异常 java.lang.UnsatisfiedLinkError:java.library.path 中没有 hello
在 java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864)
在 java.lang.Runtime.loadLibrary0(Runtime.java:870)
在 java.lang.System.loadLibrary(System.java:1122)
在HelloJNI。(HelloJNI.java:3)
这似乎是互联网上最常见的 JNI 错误...我的方法名称似乎是正确的。我也跑了:
这给了我:00000000000006b0T Java_HelloJNI_sayHello这似乎是正确的,即编译器没有添加额外的字符。我根本就没有任何可以尝试的想法。有什么建议么?
我的操作系统:Linux Mint 13,GCC 版本 4.7.3,java 版本 1.8.0_60
=========更新===============
当我更换时System.loadLibrary("hello");
by System.load("/usr0/home/jkinable/workspace/javaIDEA/jnitest/hello.so");
我的 HelloWorld 示例有效!但是,我不想使用绝对路径,所以我仍在寻找一种使用方法System.loadLibrary("hello");
反而?有什么建议么?我也尝试过在不同的 Linux 系统上运行,但遇到了同样的问题。