2014-11-29 5 views
0

Java 프로그램 (Windows 컴퓨터)에서 C 코드를 호출하기 위해 JNI를 사용하여 테스트 할 간단한 프로그램을 만들고 있지만 UnsatisfiedLinkError가 표시됩니다.UnsatisfiedLinkError ClassName.methodName() V

오류 :

$ ls 
HelloWorld.class HelloWorld.h HelloWorld.java ctest.c ctest.dll 

$ java HelloWorld 
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloWorld.helloFromC()V 
    at HelloWorld.helloFromC(Native Method) 
    at HelloWorld.main(HelloWorld.java:9) 

HelloWorld.java

public class HelloWorld { 
    native void helloFromC(); 
    static { 
      System.loadLibrary("ctest"); 
    } 
    public static void main(String[] args) { 
      HelloWorld helloWorld = new HelloWorld(); 
      helloWorld.helloFromC(); 
    } 
} 

ctest.c

#include <jni.h> 
#include <stdio.h> 

JNIEXPORT void JNICALL Java_HelloWorld_helloFromC (JNIEnv * env, jobject jobj) { 
     printf("Hello from C!\n"); 
} 

나는 아무런 문제없이 헤더 파일 HelloWorld.h을 생성, 내가 HelloWorld.class이 때문에 컴파일 내 기본 라이브러리 ctest.dll을 만들었지 만 실행하려면 위와 같은 오류가 발생합니다. 내 라이브러리를로드 할 때 명시 적으로 헤더 파일을 ctest.c에 내 원시 코드에 포함 시키면 사용자에게 절대 경로를 시도했습니다. 또한 System.load()을 정규화 된 경로와 함께 사용하려고 시도했지만 여전히 동일한 오류가 발생합니다.

답변

0

MinGW를 사용하여 Windows 7 컴퓨터에서 컴파일 할 때 이런 일이 발생했습니다. 이 문서에서는 http://www.academia.edu/5449209/JNI이라는 JNI를 성공적으로 연결하기 위해 -Wl, --add-stdcall-alias 매개 변수를 추가해야한다는 내용을 발견했습니다. 마찬가지로 : gcc -Wl - add-stdcall-alias -I "\ include \ win32"-shared -o hello.dll HelloJNI.c 이렇게하지 않으면 기호의 별칭이 만들어집니다. MinGW가 DLL에 추가하는 몇 가지 @nn 접미사. 그러면 Java에서이 메서드를 인식합니다.