Estoy tratando de ejecutar un ejemplo JNI simple donde ejecuto una aplicación Java que llama a una función C++ a través de una biblioteca dinámica.
Publicaré los siguientes códigos y comandos de terminal que utilicé.
.Java
public class Lab{ public native void hello(); static { System.loadLibrary("hello"); } public static void main(String args[]) { new Lab().hello(); } }obtener .class y archivo de encabezado a través de la terminal
javac Lab.java javah -jni Labarchivo hola.cpp
#include "Lab.h" #include <stdio.h> #include <iostream> JNIEXPORT void JNICALL Java_Lab_hello(JNIEnv *env,jobject jobj) { cout<<"Hello World"<<endl; }Generando el archivo lib "hello.so":
gcc -shared -fpic -o hello.so -I/usr/lib/jvm/jdk1.8.0_45/include -I/usr/lib/jvm/jdk1.8.0_45/include/linux hello.cppy finalmente ejecuta el archivo:
java -Djava.library.path=. Laby luego me sale el error:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865) at java.lang.Runtime.loadLibrary0(Runtime.java:870) at java.lang.System.loadLibrary(System.java:1122) at Lab.<clinit>(Lab.java:6)Sé que hay otras publicaciones con este mismo problema, pero desafortunadamente ninguna de esas soluciones funcionó para mí. Ya probé cosas como:
Necesito usar esto en una aplicación principal, pero solo estaba probando un ejemplo rápido y no pude hacerlo funcionar incluso con todas las soluciones que leí en otras publicaciones.
Gracias.