2013-09-16 1 views
2

У меня есть этот 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 не выполняется. Я никогда не сталкивался с этим раньше. Как я могу это исправить?

+0

Может быть, что DLL включена, но почему-то этот метод не найден? – ppeterka

+0

@ ppeterka66 Думал, что тоже, но я так не думаю ... Заголовочный файл генерируется 'javah', поэтому имя метода должно быть правильным, а имя функции в файле' cpp' должно быть одинаковым как в заголовке. Теоретически все в порядке, но сообщение об ошибке все еще есть:/ – BackSlash

+0

@ ppeterka66 Хммм, нет, я также пробовал с 'System.loadLibrary' (исключая расширение), но я получаю ту же ошибку – BackSlash

ответ

0

В C++ запущены имена функций в DLL, если вы находитесь в окнах, вы можете использовать dumpbin, чтобы увидеть, как выглядит имя функции в dll.

+0

Разве это не комментарий? – BackSlash

+0

Не печалью за это. – user2773289

+1

Ну, в конце концов, это может оказаться ответом ... – ppeterka

0

В вашем случае строка "native_files/pkgnative_tries__native_NativeSystem.dll" кажется беспорядочной, пожалуйста, проверьте ее.

я решил один и тот же тип вопроса, добавив

System.loadLibrary("your library name"); 

Для каждого метода, где они необходимы и, пожалуйста, также проверить, что путь библиотеки правильно.

Pls подтвердите это для получения дополнительной информации. UnsatisfiedLinkError in native method

Благодаря

Смежные вопросы