Я делаю учебник о JNI, чтобы освоиться с ним для моего проекта. Тем не менее, я застрял в этой части учебника, в котором выполняется Java-программа. Я использую Eclipse, где я создал проект Java и поместил файлы в пакет. Когда я пытаюсь следовать руководству без использования Eclipse, я не получаю ошибок, поэтому я предполагаю, что это проблема, связанная с путем.
Что касается моей ошибки, я получаю
UnsatisfiedLinkError: нет libhello в java.library.path
когда я запускаю это в моем терминале:
java -Djava.library.path=. helloJNI.HelloJNI
Даже когда я указываю свой путь, он не работает. Если вы хотите воспроизвести мои шаги, вот что я сделал:
После создания HelloJNI.java
я запустил в терминале следующее:
javac -h . HelloJNI.java
Эта команда создала сгенерированный файл заголовка, указанный ниже.
После этого я написал HelloJNI.c
, перешел в папку пакета и затем скомпилировал ее с помощью этой команды в том же каталоге:
gcc -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libhello.so HelloJNI.c
Затем я переместился на один каталог вверх по ~/eclipse-workspace/HelloJNI/src
и выполнил эту команду:
java -Djava.library.path=. HelloJNI
Что приводит к ошибке, описанной выше.
Вот мой код:
HelloJNI.java
package helloJNI;
public class HelloJNI { // Save as HelloJNI.java
static {
System.loadLibrary("hello"); // Load native library hello.dll (Windows) or libhello.so (Unixes)
// at runtime
// This library contains a native method called sayHello()
}
// Declare an instance native method sayHello() which receives no parameter and returns void
private native void sayHello();
// Test Driver
public static void main(String[] args) {
new HelloJNI().sayHello(); // Create an instance and invoke the native method
}
}
HelloJNI.c
// Save as "HelloJNI.c"
#include <jni.h> // JNI header provided by JDK
#include <stdio.h> // C Standard IO Header
#include "helloJNI_HelloJNI.h" // Generated
// Implementation of the native method sayHello()
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
printf("Hello World!\n");
return;
}
helloJNI_HelloJNI.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class helloJNI_HelloJNI */
#ifndef _Included_helloJNI_HelloJNI
#define _Included_helloJNI_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: helloJNI_HelloJNI
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_helloJNI_HelloJNI_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
Я также попытался установить путь к своему рабочему каталогу, но я все еще получаю тот же результат. Что я делаю не так?