У меня есть этот CPP файл:java.lang.UnsatisfiedLinkError с использованием нативного интерфейса
//pkgnative_tries__native_NativeSystem.cpp
#include <pkgnative_tries__native_NativeSystem.h>
#include<iostream>
using namespace std;
extern "C"
JNIEXPORT void JNICALL Java_pkgnative_tries__1native_NativeSystem_println
(JNIEnv *env, jobject obj, jstring javaString)
{
//Get the native string from javaString
const char *nativeString = env->GetStringUTFChars(javaString, 0);
cout << nativeString;
env->ReleaseStringUTFChars(javaString, nativeString);
}
pkgnative_tries__native_NativeSystem.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class pkgnative_tries__native_NativeSystem */
#ifndef _Included_pkgnative_tries__native_NativeSystem
#define _Included_pkgnative_tries__native_NativeSystem
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: pkgnative_tries__native_NativeSystem
* Method: println
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_pkgnative_tries__1native_NativeSystem_println
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
Это класс Java:
import java.io.File;
public class NativeSystem {
static {
try {
System.load(new File(NativeSystem.class.getResource("native_files/pkgnative_tries__native_NativeSystem.dll").toURI()).getPath());
} catch (Exception e) {
System.err.println("Error");
e.printStackTrace();
}
}
public static native void println(String obj);
}
Когда я звонок NativeSystem.println("abc");
показывает
Exception in thread "main" java.lang.UnsatisfiedLinkError: NativeSystem.println(Ljava/lang/String;)V
at NativeSystem.println(Native Method)
at NativeTries.main(NativeTries.java:19)
Java Result: 1
Кто-нибудь знает почему? Я уверен, что dll загружен, блок catch
в блоке static
в NativeSystem
не выполняется. Я никогда не сталкивался с этим раньше. Как я могу это исправить?
Может быть, что DLL включена, но почему-то этот метод не найден? – ppeterka
@ ppeterka66 Думал, что тоже, но я так не думаю ... Заголовочный файл генерируется 'javah', поэтому имя метода должно быть правильным, а имя функции в файле' cpp' должно быть одинаковым как в заголовке. Теоретически все в порядке, но сообщение об ошибке все еще есть:/ – BackSlash
@ ppeterka66 Хммм, нет, я также пробовал с 'System.loadLibrary' (исключая расширение), но я получаю ту же ошибку – BackSlash