2011-01-31 3 views
2

현재 Eclipse CDT 및 MinGW를 사용하여 JNI 용 Dll을 컴파일하는 데 어려움을 겪고 있습니다.MinGW의 컴파일러 옵션 Wl, kill-at가 작동하지 않습니다.

튜토리얼을 따라, 고유 메소드를 선언 한 Java 클래스를 작성한 다음 javah를 사용하여 관련 헤더 파일을 가져 와서 C++ 클래스로 구현했습니다.

는 C++ 코드는 매우 간단하고 컴파일 작동하지만, 내가 자바 클래스로 라이브러리를로드 할 때이 오류가 얻을 : 나는 "탐구"

Exception in thread "main" java.lang.UnsatisfiedLinkError: Main.integerMethod(I)I 
    at Main.integerMethod(Native Method) 
    at Main.main(Main.java:12) 

DLL을 및 방법 것을 발견 모두 "@ 14"와 같은 접미사가 있어야합니다. 문제는, 나는 이미이 아주 embarassing 태그들을 제거해야하는 -Wl, - kill-at 컴파일러 옵션을 사용하고있다. 그래서 왜 작동하지 않는가?

컴파일 로그는 다음입니다 :

**** Rebuild of configuration DLL for project JniCTest **** 

**** Internal Builder is used for build    **** 
g++ -IC:\Program Files\Java\jdk1.6.0_13\include -IC:\Program Files\Java\jdk1.6.0_13\include\win32 -O3 -Wall -c -fmessage-length=0 -mno-cygwin -D__int64=long long -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -oMain.o ..\Main.cpp 
g++ -o libJniCTest.dll -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -shared -olibJniCTest.dll Main.o 
Build complete for project JniCTest 
Time consumed: 375 ms. 

컴파일러 옵션에 대한 뭔가 문제가 있습니까? 어떤 도움을 주셔서 감사합니다.

답변

3

해결책을 찾았습니다. --kill-at 옵션을 올바른 명령에 넣지 않았습니다. 실제로 MinGW는 파일을 .o 오브젝트 파일로 컴파일 한 다음이 파일 (.o 파일)에서 링크를 수행합니다 (두 번째 라인). 그러므로 옵션은 두 x 째 행에 위치해야합니다.

소스 파일하여 Main.cpp 및 출력 DLL libJniCTest.dll에 대한

수정 명령 :

g++ -I"C:\Program Files\Java\jdk1.6.0_13\include" -I"C:\Program Files\Java\jdk1.6.0_13\include\win32" -O0 -Wall -c -oMain.o ..\Main.cpp 
g++ -Wl,--kill-at -shared -olibJniCTest.dll Main.o 
+0

덕분에 나를 위해 일한 친구 – Akhilesh

0

또한,이 걸렸다이

extern "C" { 

//implemented methods 

} 

처럼 구현을 포장하는 것을 잊지 마세요 알아야 할 시간

+1

감사합니다 @ 조나 정밀도에 오신 것을 환영합니다 스택 오버플로 :) 한 발언. 질문에 대한 구체적인 대답보다 발언이 더 필요한 내용을 말하고 싶다면 대답이 아닌 의견으로 작성해야합니다. – Dunaril

0

나는이 간단한 JNI tutorial을 IBM 사이트 에서 수행하고 주어진 Sample1.c fi를 컴파일했습니다 le 다음 명령을 사용하여 Windows XP. 나를 위해 그것의 일 벌금.

gcc -Wall -Wl,--kill-at -shared Sample1.c -o Sample1.dll -I"C:\Program Files\Java\jdk1.7.0\include" -I"C:\Program Files\Java\jdk1.7.0\include\win32"

P.S : 시스템에 따라, JDK 경로를 변경합니다.

관련 문제