2012-05-04 2 views
0

JNA를 통해 Java에서 액세스 할 수있는 DLL을 생성하려고합니다.UnsatisfiedLinkError - C++ - DLL을 만드는 방법은 무엇입니까?

void Initialize() 
{ 
    std::cout<< "Hello World!"; 
} 

iostream도 포함되어 있으며, 컴파일 한 후 내가 얻을 :

CPP :

난 그냥 간단하게 하나를 시도 CreateDll.dll

을 내가 지금 생성 할 수 있습니다 Visual Studio를 통해 * .dll. 내가 좋아하는 자바로로드하십시오

는 :

public class mainRoutine { 
    public static void main(String[] args) { 
    NativeWrapper INSTANCE = (NativeWrapper) Native.loadLibrary("CreateDll" , NativeWrapper.class);    
    INSTANCE.Initialize(); 
    } 

    static { 
    System.setProperty("jna.library.path", "C:\\workspace\\JNA"); 
    } 
} 

또 다른 인터페이스가 :

수입 com.sun.jna.Library;

public interface NativeWrapper extends Library { 
    void Initialize(); 
} 

그래서하지만 지금은 오류가 자바 기능을 실행

java.lang.UnsatisfiedLinkError: 
    Error looking up function 'Initialize': 
    The specified procedure could not be found. 

나는 무엇을 놓치고?

추신 : 많은 주제가 있다는 것을 알고 있지만 이미 하루 동안 노력하면서 해결책을 찾지 못했습니다. 도와주세요.

+0

을 나는 당신의 DLL이 필요한 기호를 수출하지 않는 같은데요. – Nick

+0

내 보낸 함수 이름을 보려면 종속성 워커 (http://www.dependencywalker.com/)를 사용하십시오. – technomage

+0

어쨌든 물건을 컴파일하려면 [JavaCPP] (http://code.google.com/p/javacpp/)가 JNA보다 사용하기가 더 쉽습니다 ... –

답변

0

당신은 수출 모두에 필요 (C++를 사용하는 경우) 함수 이름을 해제 장식합니다.

Windows에서는 일반적으로 기능을 __declspec(dllexport)과 함께 내보낼 수 있습니다.

모든 플랫폼에서 기능을 비 관리 형으로 내보내려면 extern "C"을 사용해야합니다. 특히

:

extern "C" void __declspec(dllexport) Initialize() { ... } 

이 수출 기능을 지정하는 다른 방법이 있지만 이것은 아마도 가장 일반적인 사용하기 간단합니다. 이 아닌 경우 extern "C"을 사용하면 함수는 [email protected]@과 유사하게 표시됩니다. 여기서 추가 가비지 문자는 컴파일러와 링커가 호출 시그니처를 기반으로 고유하게 인식 할 수 있도록합니다.

+0

이게이 질문을 해결했습니다. 감사합니다. –

0

당신이 기호를 내보내는 :

void _declspec(dllexport) Initialize() 
{ 
    std::cout<< "Hello World!"; 
} 
0

구현할 클래스가 있다면? .H 파일은 다음과 같습니다 여기서

namespace simpleDLLNS 
{ 
    class simpleDLL 
    { 
    public: 

     char giveVoidPtrGetChar(void* param); 
     int giveIntGetInt(int a); 
     void simpleCall(void); 
     int giveVoidPtrGetInt(void* param); 
    }; 
} 

경우 외부 입력해야한다 "C"는 무효 __declspec (dllexport)를 사용할 수? 함수를 구현할 때 사용했습니다. 내가 DLL을 열 때,이 모습 :

simpleCall @ simpleDLL @ simpleDLLNS @@ QAEXXZ

관련 문제